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

📄 vdkwin32.c

📁 Virtual Disk Driver
💻 C
字号:
/*	vdkwin32.c	VDK Win32 user application utility routines	Copyright (C) 2003 Ken Kato*/#include "vdkbase.h"#include "vdkutil.h"//// convert given path to absolute path//VDKSTAT VdkFullPath(	PCHAR	FullPath,	ULONG	BufSize,	PCHAR	FileName){	ULONG len = GetFullPathName(FileName, BufSize, FullPath, &FileName);	if (!len) {		return GetLastError();	}	if (!FileName || !*FileName) {		return VDK_PARAM;	}	return VDK_OK;}////	seek file//VDKSTAT VdkSeekFile(	HANDLE	FileHandle,	INT64	Offset){	LARGE_INTEGER loffset;	DWORD err;	loffset.QuadPart = Offset;	loffset.LowPart = SetFilePointer(		FileHandle,		loffset.LowPart,		&loffset.HighPart,		FILE_BEGIN);	if (loffset.LowPart == INVALID_SET_FILE_POINTER &&		(err = GetLastError()) != ERROR_SUCCESS) {		VDKTRACE(0,("[VDK] SetFilePointer - %s\n", VdkStatusStr(err)));		return err;	}	return ERROR_SUCCESS;}////	Open file//VDKSTAT	VdkOpenFile(	HANDLE	*FileHandle,	PCHAR	FileName,	ULONG	NameLen,	ULONG	ReadOnly){	TCHAR buf[MAX_PATH];	if (NameLen >= sizeof(buf)) {		NameLen = sizeof(buf) - 1;	}	memcpy(buf, FileName, NameLen);	buf[NameLen] = '\0';	*FileHandle = CreateFile(		buf,		ReadOnly ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),		ReadOnly ? FILE_SHARE_READ : 0,		NULL,		OPEN_EXISTING,		FILE_ATTRIBUTE_NORMAL,		NULL);	if (*FileHandle == INVALID_HANDLE_VALUE) {		DWORD err = GetLastError();		VDKTRACE(0,("[VDK] CreateFile\"%s\" - %s\n", buf, VdkStatusStr(err)));		return err;	}	return ERROR_SUCCESS;}////	create a new file//VDKSTAT	VdkCreateFile(	HANDLE	*FileHandle,	PCHAR	FileName,	BOOL	Force){	*FileHandle = CreateFile(		FileName,		(GENERIC_READ | GENERIC_WRITE),		0,		NULL,		Force ? CREATE_ALWAYS : CREATE_NEW,		FILE_ATTRIBUTE_NORMAL,		NULL);	if (*FileHandle == INVALID_HANDLE_VALUE) {		DWORD err = GetLastError();		VDKTRACE(0,("[VDK] CreateFile - %s\n", VdkStatusStr(err)));		return err;	}	return ERROR_SUCCESS;}////	check file attributes//VDKSTAT VdkCheckAttribute(	HANDLE			FileHandle){	BY_HANDLE_FILE_INFORMATION info;	if (!GetFileInformationByHandle(FileHandle, &info)) {		DWORD err = GetLastError();		VDKTRACE(0,			("[VDK] GetFileInformationByHandle - %s\n",			VdkStatusStr(err)));		return err;	}	if (info.dwFileAttributes & VDK_INVALID_ATTRIBUTES) {		VDKTRACE(0,("[VDK] File is compressed and/or encrypted\n"));		return ERROR_ACCESS_DENIED;	}	return ERROR_SUCCESS;}////	get file size//VDKSTAT	VdkGetFileSize(	HANDLE	FileHandle,	PINT64	FileSize){	ULARGE_INTEGER size;	DWORD err;	size.LowPart = GetFileSize(FileHandle, &size.HighPart);	if (size.LowPart == INVALID_FILE_SIZE &&		(err = GetLastError()) != ERROR_SUCCESS) {		VDKTRACE(0,("[VDK] GetFileSize - %s\n", VdkStatusStr(err)));		return err;	}	*FileSize = size.QuadPart;	return ERROR_SUCCESS;}////	write to file at offset//VDKSTAT	VdkWriteFileAt(	HANDLE			FileHandle,	INT64			Offset,	PVOID			Buffer,	ULONG			Length,	PULONG			Result){	DWORD err = ERROR_SUCCESS;	if (Offset != -1) {		err = VdkSeekFile(FileHandle, Offset);		if (err != ERROR_SUCCESS) {			return err;		}	}	if (WriteFile(FileHandle, Buffer, Length, &Length, NULL)) {		if (Result) {			*Result = Length;		}	}	else {		err = GetLastError();		VDKTRACE(VDKWRITE,("[VDK] WriteFile - %s\n", VdkStatusStr(err)));	}	return err;}////	read from file at offset//VDKSTAT VdkReadFileAt(	HANDLE			FileHandle,	INT64			Offset,	PVOID			Buffer,	ULONG			Length,	PULONG			Result){	DWORD err = ERROR_SUCCESS;	if (Offset != -1) {		err = VdkSeekFile(FileHandle, Offset);		if (err != ERROR_SUCCESS) {			return err;		}	}	if (ReadFile(FileHandle, Buffer, Length, &Length, NULL)) {		if (Result) {			*Result = Length;		}	}	else {		err = GetLastError();		VDKTRACE(VDKREAD,("[VDK] ReadFile - %s\n", VdkStatusStr(err)));	}	return err;}//// Adjust file size//VDKSTAT VdkSetFileSize(	HANDLE	FileHandle,	INT64	FileSize){	DWORD err;	err = VdkSeekFile(		FileHandle, FileSize);	if (err != ERROR_SUCCESS) {		return err;	}	if (!SetEndOfFile(FileHandle)) {		err = GetLastError();		VDKTRACE(0,("[VDK] SetEndOfFile - %s\n", VdkStatusStr(err)));		return err;	}	return ERROR_SUCCESS;}////	get status string//const char *VdkStatusStr(	VDKSTAT			Status){	static char buf[512];	DWORD len = FormatMessage(		FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,		NULL, Status, 0, buf, sizeof(buf), NULL);	while (len && (buf[len - 1] == '\n' || buf[len - 1] == '\r')) {		buf[--len] = '\0';	}	return buf;}////	print message to stdout//void PrintMessage(DWORD msg,...){	va_list args;	LPTSTR	buf = NULL;	va_start(args, msg);	FormatMessage(		FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER,		NULL, msg, 0, (LPTSTR)&buf, 0, &args);	va_end(args);	if (buf) {		printf("%s", buf);		LocalFree(buf);	}}////	Display prompt and accept answer//int InputChar(DWORD prompt, const char *accept){	int c;	LPTSTR	buf = NULL;	FormatMessage(		FORMAT_MESSAGE_FROM_HMODULE |		FORMAT_MESSAGE_ALLOCATE_BUFFER |		FORMAT_MESSAGE_IGNORE_INSERTS,		NULL, prompt, 0, (LPTSTR)&buf, 0, NULL);	do {		if (buf) {			printf("%s", buf);		}		else {			printf(accept);		}		fflush(stdout);		fflush(stdin);		c = tolower(getchar());	}	while (!strchr(accept, c));	if (buf) {		LocalFree(buf);	}	return c;}#ifdef VDK_DEBUG////	Debug trace function//extern unsigned long	TraceFlags	= 0;extern const char		*TraceFile	= 0;extern unsigned long	TraceLine	= 0;void VdkTrace(const char *format,...){	char buf1[512], buf2[512];	va_list args;	va_start(args, format);	_vsnprintf(buf1, sizeof(buf1), format, args);	va_end(args);	_snprintf(buf2, sizeof(buf2), "%s(%lu): %s",		TraceFile, TraceLine, buf1);	OutputDebugString(buf2);}#endif	// VDK_DEBUG

⌨️ 快捷键说明

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