ReactOSReadFile_0">ReactOS源码分析ReadFile函数分析
ReactOS源码分析ReadFile函数分析
ReadFile(IN HANDLE hFile,
IN LPVOID lpBuffer,
IN DWORD nNumberOfBytesToRead,
OUT LPDWORD lpNumberOfBytesRead OPTIONAL,
IN LPOVERLAPPED lpOverlapped OPTIONAL)
文章目录
- ReactOS源码分析ReadFile函数分析
- ReadFile
ReadFile
BOOL WINAPI
ReadFile(IN HANDLE hFile,IN LPVOID lpBuffer,IN DWORD nNumberOfBytesToRead,OUT LPDWORD lpNumberOfBytesRead OPTIONAL,IN LPOVERLAPPED lpOverlapped OPTIONAL)
{NTSTATUS Status;TRACE("ReadFile(hFile %p)\n", hFile);if (lpNumberOfBytesRead != NULL) *lpNumberOfBytesRead = 0;hFile = TranslateStdHandle(hFile);if (IsConsoleHandle(hFile)){if (ReadConsoleA(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL)){DWORD dwMode;GetConsoleMode(hFile, &dwMode);if ((dwMode & ENABLE_PROCESSED_INPUT) && *(PCHAR)lpBuffer == 0x1a){/* EOF character entered; simulate end-of-file */*lpNumberOfBytesRead = 0;}return TRUE;}return FALSE;}if (lpOverlapped != NULL){LARGE_INTEGER Offset;PVOID ApcContext;Offset.u.LowPart = lpOverlapped->Offset;Offset.u.HighPart = lpOverlapped->OffsetHigh;lpOverlapped->Internal = STATUS_PENDING;ApcContext = (((ULONG_PTR)lpOverlapped->hEvent & 0x1) ? NULL : lpOverlapped);Status = NtReadFile(hFile,lpOverlapped->hEvent,NULL,ApcContext,(PIO_STATUS_BLOCK)lpOverlapped,lpBuffer,nNumberOfBytesToRead,&Offset,NULL);/* return FALSE in case of failure and pending operations! */if (!NT_SUCCESS(Status) || Status == STATUS_PENDING){if (Status == STATUS_END_OF_FILE && lpNumberOfBytesRead != NULL)*lpNumberOfBytesRead = 0;BaseSetLastNTError(Status);return FALSE;}if (lpNumberOfBytesRead != NULL)*lpNumberOfBytesRead = lpOverlapped->InternalHigh;}else{IO_STATUS_BLOCK Iosb;Status = NtReadFile(hFile,NULL,NULL,NULL,&Iosb,lpBuffer,nNumberOfBytesToRead,NULL,NULL);/* Wait in case operation is pending */if (Status == STATUS_PENDING){Status = NtWaitForSingleObject(hFile, FALSE, NULL);if (NT_SUCCESS(Status)) Status = Iosb.Status;}if (Status == STATUS_END_OF_FILE){/** lpNumberOfBytesRead must not be NULL here, in fact Win doesn't* check that case either and crashes (only after the operation* completed).*/*lpNumberOfBytesRead = 0;return TRUE;}if (NT_SUCCESS(Status)){/** lpNumberOfBytesRead must not be NULL here, in fact Win doesn't* check that case either and crashes (only after the operation* completed).*/*lpNumberOfBytesRead = Iosb.Information;}else{BaseSetLastNTError(Status);return FALSE;}}TRACE("ReadFile() succeeded\n");return TRUE;
}