2011-12-12 24 views

回答

1

喜歡與字符串參數,AcquireCredentialsHandle()映射到要麼AcquireCredentialsHandleA()AcquireCredentialsHandleW()取決於是否UNICODE最Win32 API函數的定義,所以它分別預計char*wchar_t*指針。另一方面,SECURITY_STRING是在UNICODE_STRING結構之後建模的結構 - 兩者均僅包含UTF-16編碼的Unicode數據。

要將SECURITY_STRING值傳遞給AcquireCredentialsHandleA(),您需要將SECURITY_STRING::Buffer成員的內容先轉換爲ANSI:

PSECURITY_STRING str; 
... 
int len = WideCharToMultiByte(0, 0, (LPWSTR)str->Buffer, str->Length, NULL, 0, NULL, NULL); 
std::string tmp(len); 
WideCharToMultiByte(0, 0, (LPWSTR)str->Buffer, str->Length, &tmp[0], len, NULL, NULL); 
AcquireCredentialsHandle(..., tmp.c_str(), ...); 

要將SECURITY_STRING值傳遞給AcquireCredentialsHandleW(),你需要通過SECURITY_STRING::Buffer成員原樣是:

PSECURITY_STRING str; 
... 
AcquireCredentialsHandle(..., (LPWSTR)str->Buffer, ...); 

無論哪種方式,你不指針傳遞給SECURITY_STRING本身。

+0

只是對'SECURITY_STRING'的評論。 Buffer成員被聲明爲SECURITY_STRING文檔中的USHORT,UNICODE_STRING文檔中的PWSTR,以及sspi.h中的unsigned short *位模式)。可能是在64位模式下,「緩衝區」參數不被視爲指針,而是字符流的開始。 –

+0

'SECURITY_STRING'的文檔包含另一個可能的錯誤。 「長度」和「最大長度」成員被認爲是以字節爲單位的大小,但真正的源頭包括MIDL信息,表明兩者都以寬字符表示大小。 –

+1

'SECURITY_STRING :: Buffer'是一個指向UTF-16字符數組的指針。 'SECURITY_STRING'文件是錯誤的,它應該說'USHORT *'代替。就UTF-16而言,'USHORT *','unsigned short *'和'LPWSTR'都是相同的,並且可以在它們之間自由輸入,因爲它們都是16位的。至於'Length'和'MaximumLength',它們實際上是以字節表示的,而不是字符。 MIDL'size_is()'和'length_is()'屬性用數組元素表示。由於'Buffer'是一個UTF-16字符數組,因此MIDL聲明將「Length」和「MaximumLength」除以2. –