2013-03-21 7 views
0

을 수 std UNICODE_STRING의 형태이다. std 문자열으로 변환하고 싶습니다. 방법은 무엇입니까 ??? 수는 ... 아래 코드 내가 한스 '의견에 동의UNICODE_STRING 내가 필터 driver.This이에 의해 반환 된 파일 이름을 커널 모드에서 열린 파일의 이름을 얻을 수 <strong>pFileObject-> 파일 이름</strong>을 사용하고 문자열 변환

NTSTATUS FsFilterDispatchCreate(
    __in PDEVICE_OBJECT DeviceObject, 
    __in PIRP   Irp 
    ) 
{ 
    PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; 

    DbgPrint("%wZ\n", &pFileObject->FileName); 

    return FsFilterDispatchPassThrough(DeviceObject, Irp); 
} 
+4

기본 * new * 연산자가 작동하고 유효한 코드 페이지가 있다고 가정하면 장치 드라이버에서 수행하지 않아야 할 두 가지 사항이 있습니다. 드라이버에서 ** std :: string을 ** 사용하지 마십시오. –

+1

한스 (Hans)가 지적했듯이이 계획은 비 스타터입니다. 커널 모드에는 MSVCR90.DLL이 없습니다. –

+0

@Hans 나는 KM에서 std :: string을 사용할 계획이 아니라 UM에서 사용할 것입니다. –

답변

2

경우 예를 제공 마십시오. Windows 커널 모드에서 std :: classes를 작동시키는 것은 불가능하지는 않더라도 매우 어렵습니다. 기본 WinDDK 환경은 C++가 아니라 C입니다. 가장 좋은 방법은 UNICODE_STRING을 ANSI Null 종료 문자열로 변환하는 것입니다. (DbgPrint ("% s"...) 등으로 인쇄 할 수 있습니다. 아래 예를 참조하십시오.

UNICODE_STRING tmp; 

// ... 

ANSI_STRING dest; 
ULONG unicodeBufferSize = tmp.Length; 
// Length of unicode string in bytes must be enough to keep ANSI string 
dest.Buffer = (PCHAR)ExAllocatePool(NonPagedPool, unicodeBufferSize+1); 
// check for allocation failure... 
dest.Length = 0; 
dest.MaximumLength = unicodeBufferSize+1; 

RtlUnicodeStringToAnsiString(&dest, &tmp, FALSE); 
// check for failure... 
dest.Buffer[dest.Length] = 0; // now we get it in dest.Buffer