не совместим с PSECURITY_STRING - PullRequest
       13

не совместим с PSECURITY_STRING

0 голосов
/ 12 декабря 2011

Я пытаюсь использовать код из http://msdn.microsoft.com/en-us/library/windows/desktop/aa380536(v=VS.85).aspx

Строка для AcquireCredentialsHandle говорит, что второй аргумент не совместим с PSECURITY_STRING.Кто-нибудь знает, что я могу сделать здесь?

1 Ответ

1 голос
/ 13 декабря 2011

Как и большинство функций Win32 API со строковыми параметрами, AcquireCredentialsHandle() отображается либо на AcquireCredentialsHandleA(), либо на AcquireCredentialsHandleW() в зависимости от того, определен ли UNICODE, поэтому он ожидает указатели char* или wchar_t* соответственно. A SECURITY_STRING, с другой стороны, является структурой, которая моделируется после структуры UNICODE_STRING - обе содержат только данные Unicode в кодировке UTF-16.

Чтобы передать значение 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.

...