1,316
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------------------
void __fastcall TForm1::SetRasDialState(AnsiString EntryName, bool IsDial)
{
DWORD dwSize = sizeof(RASCONN);
LPRASCONN lpRasCon = (LPRASCONN)malloc(dwSize);
RASCONNSTATUS status;
HRASCONN hRasConn = NULL;
DWORD lpcon;
LPRASDIALPARAMS lpRasDialParams = new RASDIALPARAMS;
SetDialParams(EntryName, lpRasDialParams);
lpRasCon->dwSize = dwSize;
dwSize *= 256;
try
{
DWORD ret = 1;
while (ret && lpRasCon->dwSize > RAS_MaxEntryName)
{
ret = RasEnumConnections(lpRasCon, &dwSize, &lpcon);
if (ret)
lpRasCon->dwSize --;
}
if (!ret)
for (DWORD i = 0; i<lpcon; i++)
if (AnsiString(lpRasCon[i].szEntryName) == EntryName)
{
status.dwSize = sizeof(RASCONNSTATUS);
RasGetConnectStatus(lpRasCon->hrasconn, &status);
if (status.rasconnstate == 0x2000)
{
hRasConn = lpRasCon->hrasconn;
}
break;
}
}
catch (...) {}
free(lpRasCon);
try
{
if (hRasConn && !IsDial)
{
RasHangUp(hRasConn);
Sleep(50);
}
else if (IsDial && !hRasConn)
{
LPRASDIALPARAMS lpRasDialParams = new RASDIALPARAMS;
SetDialParams(EntryName, lpRasDialParams);
RasDial(NULL,NULL,lpRasDialParams,0L,(RASDIALFUNC)RasDialFunc,&hRasConn);
Sleep(50);
}
}
catch (...) {}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetDialParams(AnsiString EntryName,
LPRASDIALPARAMS lpRasDialParams)
{
DWORD cb, nRet, cEntries;
BOOL b;
char szPhoneBook1[512], szPhoneBook2[512], szUserName[128], szDomainName[128];
unsigned char private_data[0x500];
int data_len;
DWORD dwSize, dwDialParamsUID, dwTmp;
PSID pSid = NULL;
SID_NAME_USE peUse;
LSA_OBJECT_ATTRIBUTES lsa_object_attr;
LSA_HANDLE lsa_handle;
PLSA_UNICODE_STRING plsa_private_data;
LSA_UNICODE_STRING lsa_keyname;
NTSTATUS status;
int ret;
WCHAR *sid;
dwSize = sizeof(szUserName);
GetUserName(szUserName, &dwSize);
dwSize = 0;
dwTmp = sizeof(szDomainName);
LookupAccountName(NULL, szUserName, pSid, &dwSize, szDomainName, &dwTmp, &peUse);
if(!dwSize) return;
pSid = (PSID)malloc(dwSize);
LookupAccountName(NULL, szUserName, pSid, &dwSize, szDomainName, &dwTmp, &peUse);
ConvertSidToStringSidW(pSid, &sid);
memset(&lsa_object_attr, 0, sizeof(lsa_object_attr));
lsa_object_attr.Length = sizeof(LSA_OBJECT_ATTRIBUTES);
LsaOpenPolicy(0, &lsa_object_attr, 0x800, &lsa_handle);
plsa_private_data = (PLSA_UNICODE_STRING)malloc(sizeof(LSA_UNICODE_STRING));
plsa_private_data->Length = 0x500;
plsa_private_data->MaximumLength = 0x500;
plsa_private_data->Buffer = (PWSTR)malloc(0x500);
lsa_keyname.MaximumLength = 0x200;
lsa_keyname.Buffer = (PWSTR)malloc(0x200);
wcscpy(lsa_keyname.Buffer, L"RasDialParams!");
wcscat(lsa_keyname.Buffer, sid);
wcscat(lsa_keyname.Buffer, L"#0");
lsa_keyname.Length = wcslen(lsa_keyname.Buffer) * 2;
status = LsaRetrievePrivateData(lsa_handle,
&lsa_keyname,
&plsa_private_data);
LsaClose(lsa_handle);
if(status != 0) return;
ret = WideCharToMultiByte(0, 0, plsa_private_data->Buffer,
plsa_private_data->Length,
private_data, sizeof(private_data), 0, 0);
if(ret == 0) return;
data_len = ret;
GetEnvironmentVariable("ALLUSERSPROFILE", szPhoneBook1, sizeof(szPhoneBook1)-200);
GetEnvironmentVariable("USERPROFILE", szPhoneBook2, sizeof(szPhoneBook2)-200);
strcat(szPhoneBook1, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
strcat(szPhoneBook2, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
strcpy(lpRasDialParams->szEntryName, EntryName.c_str());
lpRasDialParams->dwSize = sizeof(RASDIALPARAMS);
RasGetEntryDialParams(0, lpRasDialParams, &b);
dwDialParamsUID = GetPrivateProfileInt(EntryName.c_str(),
"DialParamsUID", 0, szPhoneBook1);
if(dwDialParamsUID == 0)
{
dwDialParamsUID = GetPrivateProfileInt(EntryName.c_str(),
"DialParamsUID", 0, szPhoneBook2);
if(dwDialParamsUID == 0)
return;
}
char *p, szDialParamsUID[52], *pass=NULL;
_snprintf(szDialParamsUID, sizeof(szDialParamsUID), "%d", dwDialParamsUID);
p = private_data;
for(int i=0;i<data_len;i++)
if(strcmp(&p[i], szDialParamsUID) == 0 )
{
for(int j=i;j<data_len;j++)
if(strcmp(&p[j], lpRasDialParams->szUserName) == 0 )
{
pass = p + j + strlen(lpRasDialParams->szUserName) + 1;
break;
}
break;
}
strcpy(lpRasDialParams->szPassword, pass);
}
//---------------------------------------------------------------------------