⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileio.cpp

📁 详缰介绍USB编程实现应用程序对USB商品的访问与USB编程原理
💻 CPP
字号:
// FileIO.cpp -- Portable routines for file reading and writing
// Copyright (C) 1999 by Walter Oney
// All rights reserved

#include "stddcls.h"
#include "driver.h"

extern "C" NTSTATUS __cdecl Win98OpenFile(PWCHAR filename, BOOLEAN read, PHANDLE phandle);
extern "C" NTSTATUS __cdecl Win98CloseFile(HANDLE handle);
extern "C" ULONG __cdecl Win98GetFileSize(HANDLE handle);
extern "C" NTSTATUS __cdecl Win98ReadFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread);
extern "C" NTSTATUS __cdecl Win98WriteFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread);

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 OpenFile(PWCHAR filename, BOOLEAN read, PHANDLE phandle) {
	if (win98) return Win98OpenFile(filename, read, phandle);
	else return Win2KOpenFile(filename, read, phandle);
	}

NTSTATUS CloseFile(HANDLE handle) {
	if (win98) return Win98CloseFile(handle);
	else return Win2KCloseFile(handle);
	}

unsigned __int64 GetFileSize(HANDLE handle) {
	if (win98) return Win98GetFileSize(handle);
	else return Win2KGetFileSize(handle);
	}

NTSTATUS ReadFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread) {
	if (win98) return Win98ReadFile(handle, buffer, nbytes, pnumread);
	else return Win2KReadFile(handle, buffer, nbytes, pnumread);
	}

NTSTATUS WriteFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumwritten) {
	if (win98) return Win98WriteFile(handle, buffer, nbytes, pnumwritten);
	else return Win2KWriteFile(handle, buffer, nbytes, pnumwritten);
	}

///////////////////////////////////////////////////////////////////////////////

NTSTATUS Win2KOpenFile(PWCHAR filename, BOOLEAN read, PHANDLE phandle) {
	NTSTATUS status;
	OBJECT_ATTRIBUTES oa;
	UNICODE_STRING usname;
	HANDLE hfile;
	IO_STATUS_BLOCK iostatus;

// Initialize the object attributes structure we'll use to open the file.
// The OBJ_KERNEL_HANDLE flag is new and prevents user-mode code from closing
// this handle and redirecting it to some other resource.

	RtlInitUnicodeString(&usname, filename);
	InitializeObjectAttributes(&oa, &usname, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 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;
	}

///////////////////////////////////////////////////////////////////////////////

NTSTATUS Win2KCloseFile(HANDLE handle) {
	return ZwClose(handle);
	}

///////////////////////////////////////////////////////////////////////////////

unsigned __int64 Win2KGetFileSize(HANDLE handle) {
	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;
	}

///////////////////////////////////////////////////////////////////////////////

NTSTATUS Win2KReadFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumread) {
	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;
	}

///////////////////////////////////////////////////////////////////////////////

NTSTATUS Win2KWriteFile(HANDLE handle, PVOID buffer, ULONG nbytes, PULONG pnumwritten) {
	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;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -