📄 kernelmodeutils.cpp
字号:
//////////////////////////////////////////////////////////////////////////////
// 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 + -