Как и большинство функций 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
.