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

📄 kernelmodeutils.cpp

📁 PGP—Pretty Good Privacy
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

	// Perform the prepend.
	if (derr.IsntError())
	{
		status = outUniString->Append(KUstring(tempUniString, FALSE));

		if (!NT_SUCCESS(status))
			derr = DualErr(kPGDMinorError_UniStringOpFailed, status);
	}

	return derr;
}

// PrependToUni (... LPCWSTR inUniString) prepends one unicode string to
// another.

DualErr 
PrependToUni(
	KUstring	*outUniString, 
	LPCWSTR		inUniString)
{
	DualErr		derr;
	KUstring	tempUniString;
	NTSTATUS	status;
	PGPUInt16	length;

	pgpAssertAddrValid(outUniString, KUstring);
	pgpAssertAddrValid(inUniString, WCHAR);

	length = outUniString->Length() + wcslen(inUniString) + 1;

	// Allocate more space if necessary.
	if (length > outUniString->MaximumLength())
	{
		status = outUniString->GrowMaxBy(length - 
			outUniString->MaximumLength(), NonPagedPool);

		if (!NT_SUCCESS(status))
			derr = DualErr(kPGDMinorError_OutOfMemory, status);
	}

	// Prepare temp variable.
	if (derr.IsntError())
	{
		derr = AssignToUni(&tempUniString, (* outUniString));
	}

	// Prepare output variable.
	if (derr.IsntError())
	{
		derr = AssignToUni(outUniString, inUniString);
	}

	// Perform the prepend.
	if (derr.IsntError())
	{
		status = outUniString->Append(tempUniString);

		if (!NT_SUCCESS(status))
			derr = DualErr(kPGDMinorError_UniStringOpFailed, status);
	}

	return derr;
}

// PrependToUni (... LPCSTR inString) prepends an ANSI string to a unicode
// string.

DualErr 
PrependToUni(
	KUstring	*outUniString, 
	LPCSTR		inString)
{
	DualErr		derr;
	KUstring	tempUniString;
	NTSTATUS	status;
	PGPUInt16	length;

	pgpAssertStrValid(inString);
	pgpAssertAddrValid(outUniString, KUstring);

	length = outUniString->Length() + strlen(inString) + 1;

	// Allocate more space if necessary.
	if (length > outUniString->MaximumLength())
	{
		status = 
			outUniString->GrowMaxBy(length - outUniString->MaximumLength(), 
				NonPagedPool);

		if (!NT_SUCCESS(status))
			derr = DualErr(kPGDMinorError_OutOfMemory, status);
	}

	// Prepare output variable.
	if (derr.IsntError())
	{
		derr = AssignToUni(outUniString, inString);
	}

	// Prepare temp variable.
	if (derr.IsntError())
	{
		derr = AssignToUni(&tempUniString, (* outUniString));
	}

	// Perform the append
	if (derr.IsntError())
	{
		status = outUniString->Append(tempUniString);

		if (!NT_SUCCESS(status))
			derr = DualErr(kPGDMinorError_UniStringOpFailed, status);
	}

	return derr;
}


/////////////////////////////////
// Device/drive utility functions
/////////////////////////////////

// MakePathToDrive returns a link pathname corresponding to the given
// drive.

DualErr 
MakePathToDrive(PGPUInt8 drive, KUstring *outPath)
{
	DualErr	derr;
	char	driveLet[3];

	pgpAssert(IsLegalDriveNumber(drive));
	pgpAssertAddrValid(outPath, KUstring);

	// Initialize the pathname.
	driveLet[0] = DriveNumToLet(drive);
	driveLet[1] = ':';
	driveLet[2] = '\0';

	derr = AssignToUni(outPath, driveLet);

	// Prepend the link qualifier.
	if (derr.IsntError())
	{
		derr = PrependToUni(outPath, kNTLinkPathPrefix);
	}

	return derr;
}

// IsValidDeviceName returns TRUE if the specified string refers to a valid
// device, FALSE otherwise.

PGPBoolean 
IsValidDeviceName(PUNICODE_STRING deviceName)
{
	PDEVICE_OBJECT	deviceObject;
	PFILE_OBJECT	fileObject;
	NTSTATUS		status;

	pgpAssertAddrValid(deviceName, UNICODE_STRING);

	status = IoGetDeviceObjectPointer(deviceName, FILE_READ_DATA, 
		&fileObject, &deviceObject);

	if (NT_SUCCESS(status))
	{
		ObDereferenceObject(fileObject);
		return TRUE;
	}
	else
	{
		return (status != STATUS_OBJECT_NAME_NOT_FOUND);
	}
}

// IsFileInUseByReader returns TRUE if someone has opened the specified file
// with read access, FALSE otherwise.

PGPBoolean 
IsFileInUseByReader(LPCSTR path)
{
	File	existingFile;
	DualErr	derr;

	pgpAssertStrValid(path);

	derr = existingFile.Open(path, 
		kOF_ReadOnly | kOF_DenyRead | kOF_MustExist);

	if (existingFile.Opened())
	{
		existingFile.Close();
	}

	return derr.IsError();
}

// IsFileInUseByWriter returns TRUE if someone has opened the specified file
// with write access, FALSE otherwise.

PGPBoolean 
IsFileInUseByWriter(LPCSTR path)
{
	File	existingFile;
	DualErr	derr;

	pgpAssertStrValid(path);

	derr = existingFile.Open(path, 
		kOF_ReadOnly | kOF_DenyWrite | kOF_MustExist);

	if (existingFile.Opened())
	{
		existingFile.Close();
	}

	return derr.IsError();
}

// IsFileInUseByWriter returns TRUE if someone has opened the specified file,
// FALSE otherwise.

PGPBoolean 
IsFileInUse(LPCSTR path)
{
	pgpAssertStrValid(path);

	return (IsFileInUseByReader(path) || IsFileInUseByWriter(path));
}


////////////////////////////
// Error/Debugging functions
////////////////////////////

// GetName parses a nametable and determines which string is associated with
// which constant, and returns it.

LPCSTR 
GetName(NameAssoc nameTable[], PGPUInt32 n, PGPUInt32 func)
{
	PGPUInt32 i;

	for (i = 0; i < n; i++)
	{
		if (func == nameTable[i].func)
			return nameTable[i].name;
	}

	return "<Unknown>";
}

// GetADPacketName returns a string with the name of the AD packet passed in
// 'code'.

LPCSTR 
GetADPacketName(PGPUInt32 code)
{
	static NameAssoc nameTable[] =
	{
		{kAD_Mount,					"kAD_Mount"},
		{kAD_Unmount,				"kAD_Unmount"},
		{kAD_QueryVersion,			"kAD_QueryVersion"},
		{kAD_QueryMounted,			"kAD_QueryMounted"},
		{kAD_QueryOpenFiles,		"kAD_QueryOpenFiles"},
		{kAD_ChangePrefs,			"kAD_ChangePrefs"},
		{kAD_LockUnlockMem,			"kAD_LockUnlockMem"}, 
		{kAD_GetPGPdiskInfo,		"kAD_GetPGPdiskInfo"}, 
		{kAD_LockUnlockVol,			"kAD_LockUnlockVol"}, 
		{kAD_ReadWriteVol,			"kAD_ReadWriteVol"}, 
		{kAD_QueryVolInfo,			"kAD_QueryVolInfo"}, 
		{kAD_NotifyUserLogoff,		"kAD_NotifyUserLogoff"}

	};

	return GetName(nameTable, (sizeof(nameTable) / sizeof(NameAssoc)), code);
}

// GetIOCTLFunctionName returns a string with the name of the IOCTL function
// passed in 'ioctlCode'.

LPCSTR 
GetIOCTLFunctionName(PGPUInt32 ioctlCode)
{
	static NameAssoc nameTable[] =
	{
		{IOCTL_DISK_FORMAT_TRACKS,			"IOCTL_DISK_FORMAT_TRACKS"}, 
		{IOCTL_DISK_FORMAT_TRACKS_EX,		"IOCTL_DISK_FORMAT_TRACKS_EX"}, 
		{IOCTL_DISK_VERIFY,					"IOCTL_DISK_VERIFY"}, 
		{IOCTL_DISK_GET_DRIVE_GEOMETRY,		"IOCTL_DISK_GET_DRIVE_GEOMETRY"}, 
		{IOCTL_DISK_GET_MEDIA_TYPES,		"IOCTL_DISK_GET_MEDIA_TYPES"}, 
		{IOCTL_DISK_CHECK_VERIFY,			"IOCTL_DISK_CHECK_VERIFY"}, 
		{IOCTL_STORAGE_CHECK_VERIFY,		"IOCTL_STORAGE_CHECK_VERIFY"}, 
		{IOCTL_DISK_GET_PARTITION_INFO,		"IOCTL_DISK_GET_PARTITION_INFO"}, 
		{IOCTL_DISK_SET_PARTITION_INFO,		"IOCTL_DISK_SET_PARTITION_INFO"}, 
		{IOCTL_DISK_GET_DRIVE_LAYOUT,		"IOCTL_DISK_GET_DRIVE_LAYOUT"}, 
		{IOCTL_DISK_SET_DRIVE_LAYOUT,		"IOCTL_DISK_SET_DRIVE_LAYOUT"}, 
		{IOCTL_DISK_IS_WRITABLE,			"IOCTL_DISK_IS_WRITABLE"}, 
		{IOCTL_DISK_REASSIGN_BLOCKS,		"IOCTL_DISK_REASSIGN_BLOCKS"}, 
		{IOCTL_DISK_FIND_NEW_DEVICES,		"IOCTL_DISK_FIND_NEW_DEVICES"}, 
		{IOCTL_DISK_MEDIA_REMOVAL,			"IOCTL_DISK_MEDIA_REMOVAL"}, 

		{IOCTL_STORAGE_FIND_NEW_DEVICES, 
			"IOCTL_STORAGE_FIND_NEW_DEVICES"}, 

		{IOCTL_DISK_PERFORMANCE,			"IOCTL_DISK_PERFORMANCE"}, 
		{SMART_GET_VERSION,					"SMART_GET_VERSION"}, 
		{SMART_RCV_DRIVE_DATA,				"SMART_RCV_DRIVE_DATA"}, 
		{SMART_SEND_DRIVE_COMMAND,			"SMART_SEND_DRIVE_COMMAND"}, 

		{IOCTL_DISK_INTERNAL_SET_VERIFY, 
			"IOCTL_DISK_INTERNAL_SET_VERIFY"}, 

		{IOCTL_DISK_INTERNAL_CLEAR_VERIFY, 
			"IOCTL_DISK_INTERNAL_CLEAR_VERIFY"}

	};

	return GetName(nameTable, (sizeof(nameTable) / sizeof(NameAssoc)), 
		ioctlCode);
}

// GetIRPMajorFunctionName returns a string with the name of the IRP major
// function passed in 'majorFunc'.

LPCSTR 
GetIRPMajorFunctionName(PGPUInt8 majorFunc)
{
	static NameAssoc nameTable[] =
	{
		{IRP_MJ_CREATE,						"IRP_MJ_CREATE"}, 
		{IRP_MJ_CLEANUP,					"IRP_MJ_CLEANUP"}, 
		{IRP_MJ_CLOSE,						"IRP_MJ_CLOSE"}, 
		{IRP_MJ_READ,						"IRP_MJ_READ"}, 
		{IRP_MJ_WRITE,						"IRP_MJ_WRITE"}, 
		{IRP_MJ_FLUSH_BUFFERS,				"IRP_MJ_FLUSH_BUFFERS"}, 
		{IRP_MJ_DEVICE_CONTROL,				"IRP_MJ_DEVICE_CONTROL"}, 
		{IRP_MJ_INTERNAL_DEVICE_CONTROL,	"IRP_MJ_INTERNAL_DEVICE_CONTROL"}

	};

	return GetName(nameTable, (sizeof(nameTable) / sizeof(NameAssoc)), 
		majorFunc);
}

PGPBoolean
IsThisAnNT5Machine()
{
	KRegistryKey	verKey(REGISTRY_WINDOWS_NT, L"");
	LPWSTR			verString	= NULL;
	NTSTATUS		status		= STATUS_SUCCESS;
	ULONG			length		= 0;

	status = verKey.QueryValue(L"CurrentVersion", verString, length, 
		NonPagedPool);

	if (NT_SUCCESS(status))
	{
		delete[] verString;
		return (verString[0] == '5');
	}
	else
	{
		return FALSE;
	}
}

⌨️ 快捷键说明

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