LookupAccountName ошибка
Не могу разобраться где у меня ошибка. Мне необходимо узнать SID пользователя. Делаю это вот так:
VOID AddUserToLocalGroup()
{
TCHAR *sDomainName = nullptr;
SID UserSid;
SID_NAME_USE use_sid;
DWORD dwSidSize = SECURITY_MAX_SID_SIZE, dwDomainNameSize = 0x00;
BOOL result;
if(!LookupAccountName(nullptr, tsName, &UserSid, &dwSidSize, nullptr, &dwDomainNameSize, &use_sid))
{
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
sDomainName = new TCHAR[dwDomainNameSize];
if(sDomainName != nullptr)
{
memset(sDomainName, 0x00, dwDomainNameSize * sizeof(TCHAR));
result = LookupAccountName(nullptr, tsName, &UserSid, &dwSidSize, sDomainName, &dwDomainNameSize, &use_sid);
delete[] sDomainName;
}
}
}
}
За первый вызов LookupAccountName, узнаю какой буфер необходим для DomainName и далее выделяю этот буфер и потом второй раз вызываю LookupAccountName. Программа рушится при вызове оператора delete. Начал смотреть, что в адресах...
Вот, выделилась память по определенному адресу, ну и очистилась, соответственно:
После второго вызова LookupAccountName, в место, куда указывает указатель, в памяти, информация об имени домена появилась. А вот в самом указателе, теперь какой то другой непонятный адрес... К слову, в программе по данному адресу ничего нет...

Ну соответственно, при вызове delete, программа падает, потому-что по этому адресу ничего нет, тут и гадалке не ходи))) Не понимаю, где ошибка....
Ответы (1 шт):
Параметр dwSidSize при вызове функции должен содержать размер буфера, на который указывает предыдущий аргумент, в байтах. А тут буфер для SID (требуемый размер которого изначально не известен) не выделяется, а вместо размера вставлена левая константа SECURITY_MAX_SID_SIZE. Соответственно при втором вызове происходит классическое переполнение буфера.
Далее, оператор new не может возвращать нулевой указатель, так что проверка if(sDomainName != nullptr) бесполезна, а вместо memset следовало бы инициализировать массив сразу при выделении.