读书人

求好心人帮忙把看看上面代码转换成del

发布时间: 2012-12-15 15:16:03 作者: rapoo

求好心人帮忙把看看下面代码转换成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的源代码呀
不会,顶顶帖子

读书人网 >.NET

热点推荐