You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.5 KiB
148 lines
4.5 KiB
/*++
|
|
Module Name:
|
|
|
|
fileio.c
|
|
|
|
Abstract:
|
|
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Notes:
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#include <ntddk.h>
|
|
#include <wdmguid.h>
|
|
#include <ntddser.h>
|
|
#include <initguid.h>
|
|
#include "mxenum.h"
|
|
|
|
#ifdef _X86_
|
|
|
|
NTSTATUS Win2KOpenFile(PWCHAR filename, BOOLEAN read, PHANDLE phandle);
|
|
NTSTATUS Win2KCloseFile(HANDLE handle);
|
|
unsigned __int64 Win2KGetFileSize(HANDLE handle);
|
|
NTSTATUS Win2KReadFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread);
|
|
NTSTATUS Win2KWriteFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS MxenumOpenFile(PWCHAR filename, BOOLEAN read, PHANDLE phandle)
|
|
{ // OpenFile
|
|
return Win2KOpenFile(filename, read, phandle);
|
|
} // OpenFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS MxenumCloseFile(HANDLE handle)
|
|
{ // CloseFile
|
|
return Win2KCloseFile(handle);
|
|
} // CloseFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
unsigned __int64 MxenumGetFileSize(HANDLE handle)
|
|
{ // GetFileSize
|
|
return Win2KGetFileSize(handle);
|
|
} // GetFileSize
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS MxenumReadFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread)
|
|
{ // ReadFile
|
|
return Win2KReadFile(handle, buffer, nbytes, pnumread);
|
|
} // ReadFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS MxenumWriteFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumwritten)
|
|
{ // WriteFile
|
|
return Win2KWriteFile(handle, buffer, nbytes, pnumwritten);
|
|
} // WriteFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#else // not _X86_
|
|
#define Win2KOpenFile OpenFile
|
|
#define Win2KCloseFile CloseFile
|
|
#define Win2KGetFileSize GetFileSize
|
|
#define Win2KReadFile ReadFile
|
|
#define Win2KWriteFile WriteFile
|
|
#endif // not _X86_
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS Win2KOpenFile(PWCHAR filename, BOOLEAN read, PHANDLE phandle)
|
|
{ // Win2KOpenFile
|
|
NTSTATUS status;
|
|
OBJECT_ATTRIBUTES oa;
|
|
UNICODE_STRING usname;
|
|
HANDLE hfile;
|
|
IO_STATUS_BLOCK iostatus;
|
|
|
|
RtlInitUnicodeString(&usname, filename);
|
|
InitializeObjectAttributes(&oa, &usname, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
|
if (read)
|
|
status = ZwCreateFile(&hfile, GENERIC_READ, &oa, &iostatus, NULL,
|
|
0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
|
|
else
|
|
status = ZwCreateFile(&hfile, GENERIC_WRITE, &oa, &iostatus, NULL,
|
|
FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
|
|
if (NT_SUCCESS(status))
|
|
*phandle = hfile;
|
|
return status;
|
|
} // Win2KOpenFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS Win2KCloseFile(HANDLE handle)
|
|
{ // Win2KCloseFile
|
|
return ZwClose(handle);
|
|
} // Win2KCloseFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
unsigned __int64 Win2KGetFileSize(HANDLE handle)
|
|
{ // Win2KGetFileSize
|
|
NTSTATUS status;
|
|
IO_STATUS_BLOCK iostatus;
|
|
FILE_STANDARD_INFORMATION fi;
|
|
|
|
status = ZwQueryInformationFile(handle, &iostatus, (PVOID) &fi, sizeof(fi), FileStandardInformation);
|
|
if (!NT_SUCCESS(status))
|
|
return 0;
|
|
|
|
return fi.EndOfFile.QuadPart;
|
|
} // Win2KGetFileSize
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS Win2KReadFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread)
|
|
{ // Win2KReadFile
|
|
IO_STATUS_BLOCK iostatus;
|
|
ZwReadFile(handle, NULL, NULL, NULL, &iostatus, buffer, nbytes, NULL, NULL);
|
|
if (NT_SUCCESS(iostatus.Status))
|
|
*pnumread = iostatus.Information;
|
|
return iostatus.Status;
|
|
} // Win2KReadFile
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NTSTATUS Win2KWriteFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumwritten)
|
|
{ // Win2KWriteFile
|
|
IO_STATUS_BLOCK iostatus;
|
|
ZwWriteFile(handle, NULL, NULL, NULL, &iostatus, buffer, nbytes, NULL, NULL);
|
|
if (NT_SUCCESS(iostatus.Status))
|
|
*pnumwritten = iostatus.Information;
|
|
return iostatus.Status;
|
|
} // Win2KWriteFile
|
|
|