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

📄 kernelmodeutils.cpp

📁 vc环境下的pgp源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////
// KernelModeUtils.cpp
//
// Kernel-Mode utility functions.
//////////////////////////////////////////////////////////////////////////////

// $Id: KernelModeUtils.cpp,v 1.4 1999/03/31 23:51:08 nryan Exp $

// Copyright (C) 1998 by Network Associates, Inc.
// All rights reserved.

#define	__w64
#include <vdw.h>
#include <Devioctl.h>

#include "Required.h"
#include "UtilityFunctions.h"

#include "KernelModeUtils.h"
#include "File.h"
#include "Globals.h"
#include "Volume.h"


///////////////////////////
// String utility functions
///////////////////////////

// UniToAnsi converts a Unicode string to an ANSI string.

DualErr 
UniToAnsi(KUstring *uniString, LPSTR *string)
{
	ANSI_STRING	ansiString;
	DualErr		derr;
	NTSTATUS	status;
	PGPBoolean	allocedString;
	PGPUInt16	length;

	pgpAssertAddrValid(uniString, KUstring);
	pgpAssertAddrValid(string, char);

	length = uniString->Length() + 1;

	// Get space for new string.
	ansiString.Buffer = new char[length];

	if (IsNull(ansiString.Buffer))
		derr = DualErr(kPGDMinorError_OutOfMemory);

	allocedString = derr.IsntError();

	// Perform the conversion.
	if (derr.IsntError())
	{
		ansiString.MaximumLength	= length;
		ansiString.Length			= length - 1;

		status = RtlUnicodeStringToAnsiString(&ansiString, (* uniString), 
			FALSE);

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

	// Output the string.
	if (derr.IsntError())
	{
		(* string) = ansiString.Buffer;
	}

	if (derr.IsError())
	{
		if (allocedString)
			delete[] ansiString.Buffer;
	}

	return derr;
}

// AssignToUni (... PUNICODE_STRING inUniString) assigns one unicode string
// to another.

DualErr 
AssignToUni(
	KUstring		*outUniString, 
	PUNICODE_STRING	inUniString)
{
	DualErr		derr;
	NTSTATUS	status;
	PGPUInt16	length;

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

	length = inUniString->Length/sizeof(WCHAR) + 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);
	}

	// Perform the assignment.
	if (derr.IsntError())
	{
		status = outUniString->Assign(KUstring(inUniString, FALSE));

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

	return derr;
}

// AssignToUni (... LPCWSTR inUniString) assigns one unicode string to
// another.

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

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

	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);
	}

	// Perform the assignment.
	if (derr.IsntError())
	{
		status = outUniString->Assign(inUniString);

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

	return derr;
}

// AssignToUni (... LPCSTR inString) assigns an ANSI string to a unicode
// string.

DualErr 
AssignToUni(
	KUstring	*outUniString, 
	LPCSTR		inString)
{
	ANSI_STRING	ansiString;
	DualErr		derr;
	NTSTATUS	status;
	PGPUInt16	length;

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

	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);
	}

	// Perform the conversion.
	if (derr.IsntError())
	{
		RtlInitAnsiString(&ansiString, inString);

		status = RtlAnsiStringToUnicodeString((* outUniString), &ansiString, 
			FALSE);

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

	return derr;
}

// AppendToUni (... PUNICODE_STRING inUniString) appends one unicode string
// to another.

DualErr 
AppendToUni(
	KUstring		*outUniString, 
	PUNICODE_STRING	inUniString)
{
	DualErr		derr;
	NTSTATUS	status;
	PGPUInt16	length;

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

	length = outUniString->Length() + inUniString->Length/sizeof(WCHAR) + 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);
	}

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

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

	return derr;
}

// AppendToUni (... LPCWSTR inUniString) appends one unicode string to
// another.

DualErr 
AppendToUni(
	KUstring	*outUniString, 
	LPCWSTR		inUniString)
{
	DualErr		derr;
	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);
	}

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

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

	return derr;
}

// AppendToUni (... LPCSTR inString) appends an ANSI string to a unicode
// string.

DualErr 
AppendToUni(
	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);
	}

	// Perform the conversion.
	if (derr.IsntError())
	{
		derr = AssignToUni(&tempUniString, inString);
	}

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

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

	return derr;
}

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

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

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

	length = outUniString->Length() + inUniString->Length/sizeof(WCHAR) + 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);

⌨️ 快捷键说明

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