将WCHAR类型转换为char类型
内核开发中我使用PCWSTR GetCurrentProcessFileName()
{
DWORD dwAddress = (DWORD)PsGetCurrentProcess();
if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)
return NULL;
dwAddress += 0x1B0;
if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
dwAddress += 0x10;
if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
dwAddress += 0x3C;
if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
KdPrint(("Current Process Full Path Name: %ws\n", (PCWSTR)dwAddress));
return (PCWSTR)dwAddress;
} 得到了当前进程的路径,我现在要将该路径转换成char类型的字符串,我用了下面这个函数:
int ConvertFileNameWCHARToCHAR(PWCHAR pWChar, PCHAR pChar)
{
UNICODE_STRING usFileName;
ANSI_STRING asFileName;
RtlInitUnicodeString(&usFileName, pWChar);
asFileName.Length = 0;
asFileName.MaximumLength = 256;
asFileName.Buffer = pChar;
RtlUnicodeStringToAnsiString(&asFileName, &usFileName, FALSE);
pChar[asFileName.Length] = 0;
return asFileName.Length;
}
调用语句如下(调用语句在我的HookZwOpenFile中):
char aProcessName[MAXPATHLEN];
ZeroMemory(aProcessName,MAXPATHLEN); //将该空间清零
ConvertFileNameWCHARToCHAR(GetCurrentProcessFileName(),aProcessName);
加载了这个驱动以后,能够正常得到进程的路径,但是只要我一打开文件,如打开1111.txt,立即蓝屏,这是什么原因???不调用ConvertFileNameWCHARToCHAR是没有任何问题的。
我的Hook函数如下:
NTSTATUS
HookZwOpenFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG ShareAccess,
IN ULONG OpenOptions
)
{
NTSTATUS rc = 0;
char aProcessName[MAXPATHLEN];
ZeroMemory(aProcessName,MAXPATHLEN);
ConvertFileNameWCHARToCHAR(GetCurrentProcessFileName(),aProcessName);
if(ObjectAttributes->ObjectName->Length>=11)
{
if(!memcmp(ObjectAttributes->ObjectName->Buffer, L"\\??\\C:\\cccc",22 ))
{
DbgPrint("ZwOpenFile ObjectAttributes->ObjectName=%ws\n",ObjectAttributes->ObjectName->Buffer);
//return STATUS_UNSUCCESSFUL;
}
}
//调用原函数
rc=(NTSTATUS)RealZwOpenFile(FileHandle,
DesiredAccess,
ObjectAttributes,
IoStatusBlock,
ShareAccess,
OpenOptions
);
return rc;
}