Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
81e4a0f6
Commit
81e4a0f6
authored
Mar 14, 2008
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Implemented NtReadFileScatter.
parent
8ef6713a
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
90 additions
and
5 deletions
+90
-5
file.c
dlls/ntdll/file.c
+85
-0
ntdll.spec
dlls/ntdll/ntdll.spec
+4
-4
winternl.h
include/winternl.h
+1
-1
No files found.
dlls/ntdll/file.c
View file @
81e4a0f6
...
...
@@ -715,6 +715,91 @@ err:
return
status
;
}
/******************************************************************************
* NtReadFileScatter [NTDLL.@]
* ZwReadFileScatter [NTDLL.@]
*/
NTSTATUS
WINAPI
NtReadFileScatter
(
HANDLE
file
,
HANDLE
event
,
PIO_APC_ROUTINE
apc
,
void
*
apc_user
,
PIO_STATUS_BLOCK
io_status
,
FILE_SEGMENT_ELEMENT
*
segments
,
ULONG
length
,
PLARGE_INTEGER
offset
,
PULONG
key
)
{
size_t
page_size
=
getpagesize
();
int
result
,
unix_handle
,
needs_close
;
unsigned
int
options
;
NTSTATUS
status
;
ULONG
pos
=
0
,
total
=
0
;
enum
server_fd_type
type
;
ULONG_PTR
cvalue
=
apc
?
0
:
(
ULONG_PTR
)
apc_user
;
TRACE
(
"(%p,%p,%p,%p,%p,%p,0x%08x,%p,%p),partial stub!
\n
"
,
file
,
event
,
apc
,
apc_user
,
io_status
,
segments
,
length
,
offset
,
key
);
if
(
length
%
page_size
)
return
STATUS_INVALID_PARAMETER
;
if
(
!
io_status
)
return
STATUS_ACCESS_VIOLATION
;
status
=
server_get_unix_fd
(
file
,
FILE_READ_DATA
,
&
unix_handle
,
&
needs_close
,
&
type
,
&
options
);
if
(
status
)
return
status
;
if
((
type
!=
FD_TYPE_FILE
)
||
(
options
&
(
FILE_SYNCHRONOUS_IO_ALERT
|
FILE_SYNCHRONOUS_IO_NONALERT
))
||
!
(
options
&
FILE_NO_INTERMEDIATE_BUFFERING
))
{
status
=
STATUS_INVALID_PARAMETER
;
goto
error
;
}
while
(
length
)
{
if
(
offset
&&
offset
->
QuadPart
!=
(
LONGLONG
)
-
2
/* FILE_USE_FILE_POINTER_POSITION */
)
result
=
pread
(
unix_handle
,
(
char
*
)
segments
->
Buffer
+
pos
,
page_size
-
pos
,
offset
->
QuadPart
+
total
);
else
result
=
read
(
unix_handle
,
(
char
*
)
segments
->
Buffer
+
pos
,
page_size
-
pos
);
if
(
result
==
-
1
)
{
if
(
errno
==
EINTR
)
continue
;
status
=
FILE_GetNtStatus
();
break
;
}
if
(
!
result
)
{
status
=
STATUS_END_OF_FILE
;
break
;
}
total
+=
result
;
length
-=
result
;
if
((
pos
+=
result
)
==
page_size
)
{
pos
=
0
;
segments
++
;
}
}
if
(
cvalue
)
NTDLL_AddCompletion
(
file
,
cvalue
,
status
,
total
);
error:
if
(
needs_close
)
close
(
unix_handle
);
if
(
status
==
STATUS_SUCCESS
)
{
io_status
->
u
.
Status
=
status
;
io_status
->
Information
=
total
;
TRACE
(
"= SUCCESS (%u)
\n
"
,
total
);
if
(
event
)
NtSetEvent
(
event
,
NULL
);
if
(
apc
)
NtQueueApcThread
(
GetCurrentThread
(),
(
PNTAPCFUNC
)
apc
,
(
ULONG_PTR
)
apc_user
,
(
ULONG_PTR
)
io_status
,
0
);
}
else
{
TRACE
(
"= 0x%08x
\n
"
,
status
);
if
(
status
!=
STATUS_PENDING
&&
event
)
NtResetEvent
(
event
,
NULL
);
}
return
status
;
}
/***********************************************************************
* FILE_AsyncWriteService (INTERNAL)
*/
...
...
dlls/ntdll/ntdll.spec
View file @
81e4a0f6
...
...
@@ -275,8 +275,8 @@
@ stdcall NtQueueApcThread(long ptr long long long)
@ stdcall NtRaiseException(ptr ptr long)
@ stub NtRaiseHardError
@ stdcall NtReadFile(long long
long long long long long long long
)
@ st
ub NtReadFileScatter
@ stdcall NtReadFile(long long
ptr ptr ptr ptr long ptr ptr
)
@ st
dcall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr)
@ stub NtReadRequestData
@ stdcall NtReadVirtualMemory(long ptr ptr long ptr)
@ stub NtRegisterNewDevice
...
...
@@ -1118,8 +1118,8 @@
@ stdcall ZwQueueApcThread(long ptr long long long) NtQueueApcThread
@ stdcall ZwRaiseException(ptr ptr long) NtRaiseException
@ stub ZwRaiseHardError
@ stdcall ZwReadFile(long long
long long long long long long long
) NtReadFile
# @ stub Zw
ReadFileScatter
@ stdcall ZwReadFile(long long
ptr ptr ptr ptr long ptr ptr
) NtReadFile
@ stdcall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) Nt
ReadFileScatter
@ stub ZwReadRequestData
@ stdcall ZwReadVirtualMemory(long ptr ptr long ptr) NtReadVirtualMemory
@ stub ZwRegisterNewDevice
...
...
include/winternl.h
View file @
81e4a0f6
...
...
@@ -1987,7 +1987,7 @@ NTSYSAPI NTSTATUS WINAPI NtQueryVolumeInformationFile(HANDLE,PIO_STATUS_BLOCK,P
NTSYSAPI
NTSTATUS
WINAPI
NtRaiseException
(
PEXCEPTION_RECORD
,
PCONTEXT
,
BOOL
);
NTSYSAPI
NTSTATUS
WINAPI
NtRaiseHardError
(
NTSTATUS
,
ULONG
,
PUNICODE_STRING
,
PVOID
*
,
HARDERROR_RESPONSE_OPTION
,
PHARDERROR_RESPONSE
);
NTSYSAPI
NTSTATUS
WINAPI
NtReadFile
(
HANDLE
,
HANDLE
,
PIO_APC_ROUTINE
,
PVOID
,
PIO_STATUS_BLOCK
,
PVOID
,
ULONG
,
PLARGE_INTEGER
,
PULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtReadFileScatter
(
HANDLE
,
HANDLE
,
PIO_APC_ROUTINE
,
PVOID
,
PIO_STATUS_BLOCK
,
FILE_SEGMENT_ELEMENT
,
ULONG
,
PLARGE_INTEGER
,
PULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtReadFileScatter
(
HANDLE
,
HANDLE
,
PIO_APC_ROUTINE
,
PVOID
,
PIO_STATUS_BLOCK
,
FILE_SEGMENT_ELEMENT
*
,
ULONG
,
PLARGE_INTEGER
,
PULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtReadRequestData
(
HANDLE
,
PLPC_MESSAGE
,
ULONG
,
PVOID
,
ULONG
,
PULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtReadVirtualMemory
(
HANDLE
,
const
void
*
,
void
*
,
SIZE_T
,
SIZE_T
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtRegisterThreadTerminatePort
(
HANDLE
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment