2013-10-14 5 views
0

먼저 Windows 드라이버 개발을 시도하십시오. WCHAR 배열이 이 아니고이 null로 끝났다고 가정하면 WCHAR 배열 (사용자 공간에서 오는)을 UNICODE_STRING (커널 모드에서)로 변환하려면 어떻게해야합니까?WCHAR *을 유니 코드 문자열로 변환

null로 끝나는 지 확인하고 새 버퍼를 할당하지 않으면 (null에 대해 +2) RtlAnsiXXX 함수를 사용해야합니까? 적절한 방법은 무엇입니까?

감사합니다.

답변

1

wchar 배열에서 UNICODE_STRING을 초기화하려면 RtlInitUnicodeString을 사용하십시오.

WCHAR 배열 은 Null 종료이어야합니다.

그래서 wchar-string이 null로 종료되지 않으면 새 버퍼 (null에 대해 sizeof (WCHAR))를 할당하고 배열 내용을 복사 한 다음 RtlInitUnicodeString을 호출해야합니다. 사용자 모드에서 WCHAR 문자열이 null로 끝나는 내가 사용하고있는 경우

확인하려면

BOOLEAN IsStringTerminated(PWCHAR Array, USHORT ArrayLength, USHORT *StringLength) 
{ 
    BOOLEAN bStringIsTerminated = FALSE; 
    USHORT uiIndex = 0; 

    *StringLength = 0; 

    while(uiIndex < ArrayLength && bStringIsTerminated == FALSE) 
    { 
     if(Array[uiIndex] == L'\0') 
     { 
      *StringLength = uiIndex + 1; 
      bStringIsTerminated = TRUE; 
     } 
     else 
     { 
      uiIndex++; 
     } 
    } 

    return bStringIsTerminated; 
} 
+0

감사합니다. 따라서 사용자 공간 (irp-> AssociatedIrp.SystemBuffer)에서 오는 버퍼가 널 종료가 아니라고 가정하면, 새로운 커널을 할당하기 위해 어떤 커널 모드 함수를 사용해야합니까? ExAllocatePoolWithTag? – user1782427

+0

예 ExAllocatePool을 사용할 수 있습니다. – ladan

0

WCHAR 배열 하지은 NULL로 종료해야한다. UNICODE_STRING 구조는 계산 된 문자열을 위해 설계되었으므로 NULL이 아닌 WCHAR 배열과 함께 작동합니다. 길이를 알아야합니다.

예를 들어 RtlInitEmptyUnicodeString을 사용할 수 있습니다.

관련 문제