求好心人帮忙把看看下面代码转换成delphi.
语言不通,障碍啊。
int WINAPI WlxLoggedOutSAS (
PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID * pProfile)
{
if(MY_SAS_TYPE!=dwSasType)
return WLX_SAS_ACTION_NONE;
PGINA_CONTEXT pgContext = (PGINA_CONTEXT) pWlxContext;
int ret = pgContext->pWlxFuncs->WlxDialogBox(pgContext->hWlx,
pgContext->hDllInstance,
(LPWSTR)MAKEINTRESOURCE(IDD_INSERT_CARD_NOTICE_DIALOG),
NULL,
DisplaySASNoticeDlgProc
);
if(ret==IDCANCEL)
{
return WLX_SAS_ACTION_SHUTDOWN;
}
if (ret != IDC_LOGON_BUTTON)
{
return WLX_SAS_ACTION_NONE;
}
TOKEN_STATISTICS userStats;
TOKEN_GROUPS * pGroups;
DWORD cbStats;
if (!phToken)
return WLX_SAS_ACTION_NONE;
while(1)
{
if (!LogonUser(g_lpUserName,
g_lpDomain,
g_lpPassword,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
phToken))
{
//Logon failed. Give user a chance to update his disk
ret = pgContext->pWlxFuncs->WlxDialogBox(pgContext->hWlx,
pgContext->hDllInstance,
(LPWSTR)MAKEINTRESOURCE(IDD_WIN_LOGON_DIALOG),
NULL,
UpdateWindowsUserDlgProc
);
if (ret != IDOK)
{
return WLX_SAS_ACTION_NONE;
}
}
else
break;
}
pgContext->hUserToken=*phToken;
// Pass back null profile and options.
*pdwOptions = 0;
*pProfile =NULL;
// Get the authenticationid from the user token.
if (!GetTokenInformation(*phToken,
TokenStatistics,
(PVOID) &userStats,
sizeof(TOKEN_STATISTICS),
&cbStats)
)
{
return WLX_SAS_ACTION_NONE;
}
else
{
*pAuthenticationId = userStats.AuthenticationId;
}
DWORD size,i;
pGroups = (TOKEN_GROUPS *)LocalAlloc(LMEM_FIXED, 1024);
GetTokenInformation(*phToken,
TokenGroups,
pGroups,
1024,
&size);
if (size > 1024)
{
pGroups = (TOKEN_GROUPS *)LocalReAlloc(pGroups, LMEM_FIXED, size);
GetTokenInformation(*phToken,
TokenGroups,
pGroups,
size,
&size);
}
for (i = 0; i < pGroups->GroupCount ; i++)
{
if ((pGroups->Groups[i].Attributes & SE_GROUP_LOGON_ID) ==
SE_GROUP_LOGON_ID)
{
CopySid(GetLengthSid(pLogonSid),
pLogonSid,
pGroups->Groups[i].Sid );
break;
}
}
LocalFree(pGroups);
pMprNotifyInfo->pszUserName=DupMbToWsString(g_lpUserName);
pMprNotifyInfo->pszDomain=DupMbToWsString(g_lpDomain);
pMprNotifyInfo->pszPassword=DupMbToWsString(g_lpPassword);
pMprNotifyInfo->pszOldPassword = NULL;
return WLX_SAS_ACTION_LOGON;
}
[最优解释]
function WlxLoggedOutSAS (
pWlxContext: Pointer;
dwSasType: DWORD ;
pAuthenticationId: PLUID ;
pLogonSid: PSID ;
pdwOptions: PDWORD ;
phToken: PHANDLE ;
pMprNotifyInfo: PWLX_MPR_NOTIFY_INFO ;
var pProfile: Pointer ): Integer; stdcall;
var
pgContext: PGINA_CONTEXT;
ret: Integer;
userStats: KEN_STATISTICS ;
pGroups: PLTOKEN_GROUPS;
cbStats: DWORD ;
size,i: DWORD;
begin
if(MY_SAS_TYPE<>dwSasType) then begin
Result := WLX_SAS_ACTION_NONE;
Exit;
end;
pgContext := PGINA_CONTEXT( pWlxContext);
ret := pgContext^.pWlxFuncs^.WlxDialogBox(pgContext^.hWlx,
pgContext^.hDllInstance,
//(LPWSTR)MAKEINTRESOURCE(IDD_INSERT_CARD_NOTICE_DIALOG),
PWideChar(WideString(CONST_INSERT_CARD_NOTICE_DIALOG)), //字符串资源
Nil,
DisplaySASNoticeDlgProc
);
if(ret=IDCANCEL) then begin
result := WLX_SAS_ACTION_SHUTDOWN;
Exit;
end;
if (ret <> IDC_LOGON_BUTTON) then begin
result :=WLX_SAS_ACTION_NONE;
Exit;
end;
if (phToken = Nil) then begin
result := WLX_SAS_ACTION_NONE;
exit;
end;
while(true) do begin
if (not LogonUser(g_lpUserName,
g_lpDomain,
g_lpPassword,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
phToken)) then begin
//Logon failed. Give user a chance to update his disk
ret := pgContext^.pWlxFuncs^.WlxDialogBox(pgContext^.hWlx,
pgContext^.hDllInstance,
//(LPWSTR)MAKEINTRESOURCE(IDD_WIN_LOGON_DIALOG),
PWideChar(WideString(CONST_WIN_LOGON_DIALOG)), //字符串资源
Nil,
UpdateWindowsUserDlgProc
);
if (ret <> IDOK) then begin
result := WLX_SAS_ACTION_NONE;
exit;
end;
end else begin
break;
end;
end;
pgContext^.hUserToken := phToken^;
// Pass back null profile and options.
pdwOptions^ := 0;
pProfile := NIL;
// Get the authenticationid from the user token.
if (NOt GetTokenInformation(phToken^,
TokenStatistics,
Pointer( @userStats),
sizeof(TOKEN_STATISTICS),
@cbStats)
) then begin
result := WLX_SAS_ACTION_NONE;
exit;
end else begin
pAuthenticationId^ := userStats.AuthenticationId;
end;
pGroups := PTOKEN_GROUPS (LocalAlloc(LMEM_FIXED, 1024));
GetTokenInformation(phToken^,
TokenGroups,
pGroups,
1024,
@size);
if (size > 1024) then begin
pGroups := PTOKEN_GROUPS (LocalReAlloc(pGroups, LMEM_FIXED, size));
GetTokenInformation(phToken^,
TokenGroups,
pGroups,
size,
@size);
end;
for i := 0 to pGroups^.GroupCount-1 do begin
if ((pGroups^.Groups[i].Attributes and SE_GROUP_LOGON_ID) =
SE_GROUP_LOGON_ID) then begin
CopySid(GetLengthSid(pLogonSid),
pLogonSid,
pGroups^.Groups[i].Sid );
break;
end;
end;
LocalFree(pGroups);
pMprNotifyInfo^.pszUserName:=DupMbToWsString(g_lpUserName);
pMprNotifyInfo^.pszDomain:=DupMbToWsString(g_lpDomain);
pMprNotifyInfo^.pszPassword:=DupMbToWsString(g_lpPassword);
pMprNotifyInfo^.pszOldPassword := NIL;
result := WLX_SAS_ACTION_LOGON;
end;
[其他解释]
噢,我的天呀,怎么看好像是VC的源代码呀
不会,顶顶帖子