Добрый день! Помогите разобраться плз!! Не пойму в чем дело: из всех экспортируемых функций gin`ы я переписал только WlxLoggedOutSAS вызывая в ней свой диалог аутотентификации. Но при загрузке шела (WlxActivateUserShell) вначале идет "загрузка параметров" а потом тутже их сохранение и рестарт компа. Оказалось что надо еще возвращать WinLogon`у PSID юзера. Нашел пример кода на С и перевел его на Паскаль. Но при попытке получить размер для PTokenGroups выдает: "Область данных переданная системному вызову слишком мала". Вот код функции:
function WlxLoggedOutSAS(pWlxContext: Pointer; dwSasType: DWORD;
pAuthenticationId: PLargeInteger; pLogonSid: PSID; pdwOptions: PDWORD;
phToken: PHandle; pMprNotifyInfo: PWlxMprNotifyInfo; out pProfile: Pointer
): Integer; stdcall;
var
pgContext: PGinaContext; //PGINA_CONTEXT;
userStats: TOKEN_STATISTICS;
cbStats: DWORD;
pGroups: PTokenGroups;//PTOKEN_GROUPS;
cbGroups: ULONG;
i: ULONG;
login, password, domain: string;
iLogResult: DWORD;
begin
result := WLX_SAS_ACTION_NONE;
pgContext := PGinaContext (pWlxContext);
if (phToken <> nil) then
begin
iLogResult := TFormGPL.MostraGPL(Login, Password, Domain);//вызов диалога
case iLogResult of
idOk : begin
if (LogonUser(PChar(login), PChar(Domain), PChar(Password),
LOGON32_LOGON_UNLOCK, LOGON32_PROVIDER_DEFAULT, phToken^)) then // логин юзера
begin
if (phToken^ <> 0) then
begin
pgContext.UserToken := phToken^;//!!!возвращаем winLogon`у
pdwOptions^ := 0;
pProfile := nil;
if (GetTokenInformation(phToken^, TokenStatistics, Pointer(@UserStats),
sizeof(TOKEN_STATISTICS), cbStats)) then //получаем AuthenticationId
begin
pAuthenticationId^ := Int64(UserStats.AuthenticationId);//!!!возвращаем winLogon`у
if (GetTokenInformation(phToken^, TokenGroups, nil,
0, cbGroups)) then //пытаемся получить размер для pGroups — уходит на "else"
begin
pGroups := PTokenGroups(LocalAlloc(LMEM_FIXED,cbGroups));
if (GetTokenInformation(phToken^, TokenGroups, pGroups,
SizeOf(PTokenGroups), cbGroups)) then
begin
i := 0;
While i < pGroups.GroupCount do
begin
if (pGroups.Groups[i].Attributes = SE_GROUP_LOGON_ID) then
begin
CopySid(GetLengthSid(pGroups.Groups[i].Sid), pLogonSid, pGroups.Groups[i].Sid); );//!!!копируем для возврата PSID winLogon`у
break;
end;
inc(i);
end;
end;
end else SaveLogFile('WlxLoggedOutSAS_Err:' + SysErrorMessage(GetLastError));
pMprNotifyInfo.pszUserName := DupString(login);
pMprNotifyInfo.pszDomain := DupString(domain);
pMprNotifyInfo.pszPassword := DupString(password);
pMprNotifyInfo.pszOldPassword := nil;
result := WLX_SAS_ACTION_LOGON;
end; //token
end;//not 0
end;//logon
end;//mrOK
idCancel : result := WLX_SAS_ACTION_NONE;
idAbort : result := WLX_SAS_ACTION_SHUTDOWN;
idRetry ://вызвать стандартный диалог
begin
Result := pfWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId,
pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);
end;
end;//case
end;//if
SaveLogFile('WlxLoggedOutSAS result='+IntToStr(Result)); //++
end;
может Token кривой возвращается или вообще в коде что не так?
и есть ли возможность получить SID другим способом