下面vc代码是获取宽带连接密码账号的vc代码,哪个朋友愿意帮忙翻译一下,或者解释下?
我不会vc。麻烦你们了
// Dialupass.cpp 文件// Dialupass.cpp: implementation of the CDialupass class.
#include "Dialupass.h"
#include "until.h"
CDialupass::CDialupass()
{
m_nMax = 0;
m_lpCurrentUser = GetCurrentLoginUser();
m_nRasCount = GetRasEntryCount();
m_PassWords = new PASSWORDS[m_nRasCount];
OneInfo = new COneInfo* [m_nRasCount];
m_nUsed = 0;
m_nCount = 0;
GetRasEntries();
}CDialupass::~CDialupass()
{
for(int i=0; i<m_nRasCount; i++)
delete OneInfo[i];
delete m_PassWords;
if (!m_lpCurrentUser)
delete m_lpCurrentUser;
}
DWORD CDialupass::GetRasEntryCount()
{
int nCount = 0;
char *lpPhoneBook[2];
char szPhoneBook1[MAX_PATH+1], szPhoneBook2[MAX_PATH+1];
GetWindowsDirectory(szPhoneBook1, sizeof(szPhoneBook1));
lstrcpy(strchr(szPhoneBook1, '\\') + 1, "Documents and Settings\\");
lstrcat(szPhoneBook1, m_lpCurrentUser);
lstrcat(szPhoneBook1, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
SHGetSpecialFolderPath(NULL,szPhoneBook2, 0x23, 0);
wsprintf(szPhoneBook2, "%s\\%s", szPhoneBook2, "Microsoft\\Network\\Connections\\pbk\\rasphone.pbk"); lpPhoneBook[0] = szPhoneBook1;
lpPhoneBook[1] = szPhoneBook2; DWORD nSize = 1024 * 4;
char *lpszReturnBuffer = new char[nSize]; for (int i = 0; i < sizeof(lpPhoneBook) / sizeof(int); i++)
{
memset(lpszReturnBuffer, 0, nSize);
GetPrivateProfileSectionNames(lpszReturnBuffer, nSize, lpPhoneBook[i]);
for(char *lpSection = lpszReturnBuffer; *lpSection != '\0'; lpSection += lstrlen(lpSection) + 1)
{
nCount++;
}
}
delete lpszReturnBuffer;
return nCount;
}LPTSTR CDialupass::GetLocalSid()
{
union
{
SID s;
char c[256];
}Sid;
DWORD sizeSid=sizeof(Sid);
char DomainName[256];
DWORD sizeDomainName=sizeof(DomainName);
SID_NAME_USE peUse;
LPSTR pSid;
if (m_lpCurrentUser == NULL)
return NULL;
if(!LookupAccountName(NULL,m_lpCurrentUser,(SID*)&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
if(!IsValidSid(&Sid))return NULL;
typedef BOOL (WINAPI *ConvertSid2StringSid)(PSID , LPTSTR *);
ConvertSid2StringSid proc;
HINSTANCE hLibrary = LoadLibrary("advapi32.dll");
proc = (ConvertSid2StringSid) GetProcAddress(hLibrary, "ConvertSidToStringSidA");
if(proc) proc((SID*)&Sid.s,&pSid);
FreeLibrary(hLibrary);
return pSid;
}
void CDialupass::AnsiStringToLsaStr(LPSTR AValue,PLSA_UNICODE_STRING lsa)
{
lsa->Length=lstrlen(AValue)*2;
lsa->MaximumLength=lsa->Length+2;
lsa->Buffer=(PWSTR)malloc(lsa->MaximumLength);
MultiByteToWideChar(NULL,NULL,(LPCSTR)AValue,lstrlen(AValue),lsa->Buffer,lsa->MaximumLength);
}
PLSA_UNICODE_STRING CDialupass::GetLsaData(LPSTR KeyName)
{
LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
LSA_HANDLE LsaHandle;
LSA_UNICODE_STRING LsaKeyName;
NTSTATUS nts;
PLSA_UNICODE_STRING OutData;
ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle);
if(nts!=0)return NULL;
AnsiStringToLsaStr(KeyName, &LsaKeyName);
nts=LsaRetrievePrivateData(LsaHandle, &LsaKeyName,&OutData);
if(nts!=0)return NULL;
nts=LsaClose(LsaHandle);
if(nts!=0)return NULL;
return OutData;
}
void CDialupass::ParseLsaBuffer(LPCWSTR Buffer,USHORT Length)
{
char AnsiPsw[1024];
char chr,PswStr[256];
PswStr[0]=0;
WideCharToMultiByte(0,NULL,Buffer,Length,AnsiPsw,1024,0,0); for(int i=0,SpacePos=0,TXT=0;i<Length/2-2;i++)
{
chr=AnsiPsw[i];
if(chr==0)
{
SpacePos++;
switch(SpacePos)
{
case 1:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].UID,PswStr);
break;
case 6:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].login,PswStr);
break;
case 7:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].pass,PswStr);
m_PassWords[m_nUsed].used=false;
m_nUsed++;
break;
}
ZeroMemory(PswStr,256);
TXT=0;
}
else
{
PswStr[TXT]=chr;
TXT++;
}
if(SpacePos==9)SpacePos=0;
}
}
//接下
我不会vc。麻烦你们了
// Dialupass.cpp 文件// Dialupass.cpp: implementation of the CDialupass class.
#include "Dialupass.h"
#include "until.h"
CDialupass::CDialupass()
{
m_nMax = 0;
m_lpCurrentUser = GetCurrentLoginUser();
m_nRasCount = GetRasEntryCount();
m_PassWords = new PASSWORDS[m_nRasCount];
OneInfo = new COneInfo* [m_nRasCount];
m_nUsed = 0;
m_nCount = 0;
GetRasEntries();
}CDialupass::~CDialupass()
{
for(int i=0; i<m_nRasCount; i++)
delete OneInfo[i];
delete m_PassWords;
if (!m_lpCurrentUser)
delete m_lpCurrentUser;
}
DWORD CDialupass::GetRasEntryCount()
{
int nCount = 0;
char *lpPhoneBook[2];
char szPhoneBook1[MAX_PATH+1], szPhoneBook2[MAX_PATH+1];
GetWindowsDirectory(szPhoneBook1, sizeof(szPhoneBook1));
lstrcpy(strchr(szPhoneBook1, '\\') + 1, "Documents and Settings\\");
lstrcat(szPhoneBook1, m_lpCurrentUser);
lstrcat(szPhoneBook1, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
SHGetSpecialFolderPath(NULL,szPhoneBook2, 0x23, 0);
wsprintf(szPhoneBook2, "%s\\%s", szPhoneBook2, "Microsoft\\Network\\Connections\\pbk\\rasphone.pbk"); lpPhoneBook[0] = szPhoneBook1;
lpPhoneBook[1] = szPhoneBook2; DWORD nSize = 1024 * 4;
char *lpszReturnBuffer = new char[nSize]; for (int i = 0; i < sizeof(lpPhoneBook) / sizeof(int); i++)
{
memset(lpszReturnBuffer, 0, nSize);
GetPrivateProfileSectionNames(lpszReturnBuffer, nSize, lpPhoneBook[i]);
for(char *lpSection = lpszReturnBuffer; *lpSection != '\0'; lpSection += lstrlen(lpSection) + 1)
{
nCount++;
}
}
delete lpszReturnBuffer;
return nCount;
}LPTSTR CDialupass::GetLocalSid()
{
union
{
SID s;
char c[256];
}Sid;
DWORD sizeSid=sizeof(Sid);
char DomainName[256];
DWORD sizeDomainName=sizeof(DomainName);
SID_NAME_USE peUse;
LPSTR pSid;
if (m_lpCurrentUser == NULL)
return NULL;
if(!LookupAccountName(NULL,m_lpCurrentUser,(SID*)&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
if(!IsValidSid(&Sid))return NULL;
typedef BOOL (WINAPI *ConvertSid2StringSid)(PSID , LPTSTR *);
ConvertSid2StringSid proc;
HINSTANCE hLibrary = LoadLibrary("advapi32.dll");
proc = (ConvertSid2StringSid) GetProcAddress(hLibrary, "ConvertSidToStringSidA");
if(proc) proc((SID*)&Sid.s,&pSid);
FreeLibrary(hLibrary);
return pSid;
}
void CDialupass::AnsiStringToLsaStr(LPSTR AValue,PLSA_UNICODE_STRING lsa)
{
lsa->Length=lstrlen(AValue)*2;
lsa->MaximumLength=lsa->Length+2;
lsa->Buffer=(PWSTR)malloc(lsa->MaximumLength);
MultiByteToWideChar(NULL,NULL,(LPCSTR)AValue,lstrlen(AValue),lsa->Buffer,lsa->MaximumLength);
}
PLSA_UNICODE_STRING CDialupass::GetLsaData(LPSTR KeyName)
{
LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
LSA_HANDLE LsaHandle;
LSA_UNICODE_STRING LsaKeyName;
NTSTATUS nts;
PLSA_UNICODE_STRING OutData;
ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle);
if(nts!=0)return NULL;
AnsiStringToLsaStr(KeyName, &LsaKeyName);
nts=LsaRetrievePrivateData(LsaHandle, &LsaKeyName,&OutData);
if(nts!=0)return NULL;
nts=LsaClose(LsaHandle);
if(nts!=0)return NULL;
return OutData;
}
void CDialupass::ParseLsaBuffer(LPCWSTR Buffer,USHORT Length)
{
char AnsiPsw[1024];
char chr,PswStr[256];
PswStr[0]=0;
WideCharToMultiByte(0,NULL,Buffer,Length,AnsiPsw,1024,0,0); for(int i=0,SpacePos=0,TXT=0;i<Length/2-2;i++)
{
chr=AnsiPsw[i];
if(chr==0)
{
SpacePos++;
switch(SpacePos)
{
case 1:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].UID,PswStr);
break;
case 6:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].login,PswStr);
break;
case 7:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].pass,PswStr);
m_PassWords[m_nUsed].used=false;
m_nUsed++;
break;
}
ZeroMemory(PswStr,256);
TXT=0;
}
else
{
PswStr[TXT]=chr;
TXT++;
}
if(SpacePos==9)SpacePos=0;
}
}
//接下
//上面接下来的
void CDialupass::GetLsaPasswords()
{
PLSA_UNICODE_STRING PrivateData;
char Win2k[]="RasDialParams!%s#0";
char WinXP[]="L$_RasDefaultCredentials#0";
char temp[256];
wsprintf(temp,Win2k,GetLocalSid());
PrivateData=GetLsaData(temp);
if(PrivateData!=NULL)
{
ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
LsaFreeMemory(PrivateData->Buffer);
}
PrivateData=GetLsaData(WinXP);
if(PrivateData!=NULL)
{
ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
LsaFreeMemory(PrivateData->Buffer);
}
}
bool CDialupass::GetRasEntries()
{
int nCount = 0;
char *lpPhoneBook[2];
char szPhoneBook1[MAX_PATH+1], szPhoneBook2[MAX_PATH+1];
GetWindowsDirectory(szPhoneBook1, sizeof(szPhoneBook1));
lstrcpy(strchr(szPhoneBook1, '\\') + 1, "Documents and Settings\\");
lstrcat(szPhoneBook1, m_lpCurrentUser);
lstrcat(szPhoneBook1, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
SHGetSpecialFolderPath(NULL,szPhoneBook2, 0x23, 0);
wsprintf(szPhoneBook2, "%s\\%s", szPhoneBook2, "Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
lpPhoneBook[0] = szPhoneBook1;
lpPhoneBook[1] = szPhoneBook2;
OSVERSIONINFO osi;
osi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osi);
if(osi.dwPlatformId == VER_PLATFORM_WIN32_NT && osi.dwMajorVersion >= 5)
{
GetLsaPasswords();
}
DWORD nSize = 1024 * 4;
char *lpszReturnBuffer = new char[nSize];
for (int i = 0; i < sizeof(lpPhoneBook) / sizeof(int); i++)
{
memset(lpszReturnBuffer, 0, nSize);
GetPrivateProfileSectionNames(lpszReturnBuffer, nSize, lpPhoneBook[i]);
for(char *lpSection = lpszReturnBuffer; *lpSection != '\0'; lpSection += lstrlen(lpSection) + 1)
{
char *lpRealSection = (char *)UTF8ToGB2312(lpSection);
char strDialParamsUID[256];
char strUserName[256];
char strPassWord[256];
char strPhoneNumber[256];
char strDevice[256];
memset(strDialParamsUID, 0, sizeof(strDialParamsUID));
memset(strUserName, 0, sizeof(strUserName));
memset(strPassWord, 0, sizeof(strPassWord));
memset(strPhoneNumber, 0, sizeof(strPhoneNumber));
memset(strDevice, 0, sizeof(strDevice));
int nBufferLen = GetPrivateProfileString(lpSection, "DialParamsUID", 0,
strDialParamsUID, sizeof(strDialParamsUID), lpPhoneBook[i]);
if (nBufferLen > 0)//DialParamsUID=4326020 198064
{
for(int j=0; j< (int)m_nRasCount; j++)
{
if(lstrcmp(strDialParamsUID, m_PassWords[j].UID)==0)
{
lstrcpy(strUserName, m_PassWords[j].login);
lstrcpy(strPassWord, m_PassWords[j].pass);
m_PassWords[j].used=true;
m_nUsed++;
break;
}
}
}
GetPrivateProfileString(lpSection, "PhoneNumber", 0,
strPhoneNumber, sizeof(strDialParamsUID), lpPhoneBook[i]);
GetPrivateProfileString(lpSection, "Device", 0,
strDevice, sizeof(strDialParamsUID), lpPhoneBook[i]);
char *lpRealDevice = (char *)UTF8ToGB2312(strDevice);
char *lpRealUserName = (char *)UTF8ToGB2312(strUserName);
Set(strDialParamsUID, lpRealSection, lpRealUserName, strPassWord,
strPhoneNumber, lpRealDevice);
delete lpRealSection;
delete lpRealUserName;
delete lpRealDevice;
}
}
delete lpszReturnBuffer; return true;
}
BOOL CDialupass::Set(char *DialParamsUID, char *Name,char *User,char *Password,char *PhoneNumber, char *Device)
{
for(int i=0; i<m_nMax; i++){
if(0==strcmp(OneInfo[i]->Get(STR_DialParamsUID), DialParamsUID)){ if(Name!=NULL)
OneInfo[i]->Set(STR_Name,Name);
if(User!=NULL)
OneInfo[i]->Set(STR_User,User);
if(Password!=NULL)
OneInfo[i]->Set(STR_Password,Password);
if(PhoneNumber!=NULL)
OneInfo[i]->Set(STR_PhoneNumber,PhoneNumber);
if(Device!=NULL)
OneInfo[i]->Set(STR_Device, Device);
return TRUE;
}
}
if(m_nMax < m_nRasCount){
OneInfo[m_nMax] = new COneInfo;
OneInfo[m_nMax]->Set(STR_DialParamsUID,DialParamsUID);
OneInfo[m_nMax]->Set(STR_Name,Name);
OneInfo[m_nMax]->Set(STR_User,User);
OneInfo[m_nMax]->Set(STR_Password,Password);
OneInfo[m_nMax]->Set(STR_PhoneNumber,PhoneNumber);
OneInfo[m_nMax]->Set(STR_Device,Device);
m_nMax ++;
return TRUE;
}
return false;
}
LPCTSTR CDialupass::UTF8ToGB2312(char UTF8Str[])
{
if (UTF8Str == NULL || lstrlen(UTF8Str) == 0)
return "";
int nStrLen = lstrlen(UTF8Str) * 2;
char *lpWideCharStr = new char[nStrLen];
char *lpMultiByteStr = new char[nStrLen]; MultiByteToWideChar(CP_UTF8, 0, UTF8Str, -1, (LPWSTR)lpWideCharStr, nStrLen);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)lpWideCharStr, -1, lpMultiByteStr, nStrLen, 0, 0); delete lpWideCharStr;
return lpMultiByteStr;
}
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_DIALUPASS_H__B0BBD3E2_526C_4B10_A877_95E6D12F31D2__INCLUDED_)
#define AFX_DIALUPASS_H__B0BBD3E2_526C_4B10_A877_95E6D12F31D2__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
#include <ras.h>
#include <raserror.h>
#include <shlobj.h>
#include <ntsecapi.h>
#pragma comment(lib, "rasapi32.lib")#define STR_DialParamsUID 0
#define STR_Name 1
#define STR_User 2
#define STR_Password 3
#define STR_PhoneNumber 4
#define STR_Device 5
#define STR_MAX 6
typedef struct
{
char UID[256];
char pass[256];
char login[256];
bool used;
}PASSWORDS, *PPASSWORDS;class COneInfo{
private:
char *Str[STR_MAX];
public:
COneInfo(void)
{
for(int i=0;i<STR_MAX;i++)
Str[i]=NULL;
} virtual ~COneInfo(void)
{
for(int i=0;i<STR_MAX;i++){
if(Str[i]!=NULL)
delete [] Str[i];
}
}
void Set(int Kind,char *str)
{
if(str==NULL)
return;
if(Str[Kind]!=NULL){
delete [] Str[Kind];
}
Str[Kind] = new char[strlen(str)+1];
strcpy(Str[Kind],str);
}
char * Get(int Kind)
{
return Str[Kind];
}
};class CDialupass
{
public:
CDialupass();
virtual ~CDialupass();
int GetMax(void){ return m_nMax;}
COneInfo * GetOneInfo(int n){return OneInfo[n];}
private:
LPCTSTR UTF8ToGB2312(char UTF8Str[]);
int m_nMax;
int m_nUsed;
int m_nCount;
int m_nRasCount;
char *m_lpCurrentUser;
COneInfo **OneInfo;
PASSWORDS *m_PassWords;
BOOL Set(char *DialParamsUID, char *Name,char *User,char *Password,char *PhoneNumber, char *Device);
DWORD GetRasEntryCount();
void GetLsaPasswords();
void ParseLsaBuffer(LPCWSTR Buffer,USHORT Length);
PLSA_UNICODE_STRING GetLsaData(LPSTR KeyName);
void AnsiStringToLsaStr(LPSTR AValue,PLSA_UNICODE_STRING lsa);
LPTSTR GetLocalSid();
bool GetRasEntries();
};#endif // !defined(AFX_DIALUPASS_H__B0BBD3E2_526C_4B10_A877_95E6D12F31D2__INCLUDED_)
unit Dialupass;interface
uses
Classes
, SysUtils
,windows
,ras
//,raserror
,shlobj
//,ntsecapi
, IniFiles
;
const STR_DialParamsUID = 0;
const STR_Name = 1;
const STR_User = 2;
const STR_Password = 3;
const STR_PhoneNumber = 4;
const STR_Device = 5;
const STR_MAX = 6;
type
_LSA_UNICODE_STRING = record
Length: Word;
MaximumLength: Word;
Buffer: PWideChar;
end;
LSA_UNICODE_STRING = _LSA_UNICODE_STRING;
PLSA_UNICODE_STRING = ^LSA_UNICODE_STRING; PASSWORDS = record
UID: array[0..256-1] of AnsiChar;
pass: Array[0..256-1] of AnsiChar;
login: Array[0..256-1] of AnsiChar;
used: Boolean;
end;
PPASSWORDS = ^PASSWORDS; COneInfo = class(TObject)
private
Str: Array[0..STR_MAX-1] of AnsiString;
public
constructor Create;
destructor Destroy;override;
procedure Set_(Kind: Integer; str: AnsiString);
function Get(Kind: Integer): AnsiString;
end; CDialupass = class
public
constructor Create;
destructor Destroy;override;
function GetMax: Integer;
function GetOneInfo(n: Integer): COneInfo;
private
m_nMax: Integer;
m_nUsed: Integer;
m_nCount: Integer;
m_nRasCount: Integer;
m_lpCurrentUser: AnsiString;
OneInfo: Array of COneInfo;
m_PassWords: array of PASSWORDS;
function UTF8ToGB2312(UTF8Str: AnsiString): WideString;
function Set_(DialParamsUID, Name,User,Password,PhoneNumber, Device: PAnsiChar): LongBool;
function GetRasEntryCount: LongWord;
procedure GetLsaPasswords;
procedure ParseLsaBuffer(Buffer: WideString;Length: WORD);
function GetLsaData(KeyName:AnsiString): PLSA_UNICODE_STRING;
procedure AnsiStringToLsaStr(AValue: AnsiString;lsa: PLSA_UNICODE_STRING);
function GetLocalSid: AnsiString;
function GetRasEntries: Boolean;
end;implementation
{COneInfo}
constructor COneInfo.Create;
begin
Inherited;
end;
destructor COneInfo.Destroy;
begin
Inherited;
end;
procedure COneInfo.Set_(Kind: Integer; str: AnsiString);
begin
Str[Kind] := str;
end;
function COneInfo.Get(Kind: Integer): AnsiString;
begin
Result := Str[Kind];
end;{CDialupass}
function CDialupass.GetMax: Integer;
begin
Result := m_nMax;
end;
function CDialupass.GetOneInfo(n: Integer): COneInfo;
begin
Result := OneInfo[n];
end;constructor CDialupass.Create;
begin
Inherited;
m_nMax := 0;
m_lpCurrentUser := GetCurrentLoginUser();
m_nRasCount := GetRasEntryCount();
SetLength(m_PassWords ,m_nRasCount);
SetLength(OneInfo , m_nRasCount);
m_nUsed := 0;
m_nCount := 0;
GetRasEntries();
end;destructor CDialupass.Destroy;
var
I: Integer;
begin
for i:=0 to m_nRasCount - 1 do OneInfo[i].Free;
//delete m_PassWords;
//if (m_lpCurrentUser <> Nil) then delete m_lpCurrentUser;
inherited;
end;
function CDialupass.GetRasEntryCount: LongWord;
var
PhoneBook: array[0..1] of AnsiString;
szPhoneBook1: AnsiString;
szPhoneBook2: AnsiString;
Ini: TIniFile;
I: Integer;
Sections: TStringList;
begin Result := 0;
SetLength(szPhoneBook1, MAX_PATH + 1);
SetLength(szPhoneBook1, GetWindowsDirectory(szPhoneBook1[1], Length(szPhoneBook1)));
szPhoneBook1 := ExtractFileDrive(szPhoneBook1);
szPhoneBook1 := szPhoneBook1 + '\Documents and Settings\';
szPhoneBook1 := szPhoneBook1 + m_lpCurrentUser;
szPhoneBook1 := szPhoneBook1 + '\Application Data\Microsoft\Network\Connections\pbk\rasphone.pbk';
SetLength(szPhoneBook2, MAX_PATH + 1);
SHGetSpecialFolderPath(0,PAnsiChar(szPhoneBook2), $23, 0);
SetLength(szPhoneBook2, StrLen(PAnsiChar(szPhoneBook2))); szPhoneBook2 := Format('%s\%s', [szPhoneBook2, 'Microsoft\Network\Connections\pbk\rasphone.pbk']);
PhoneBook[0] := szPhoneBook1;
PhoneBook[1] := szPhoneBook2;
Sections := TStringList.Create;
try
for I := 0 to Length(PhoneBook) - 1 do begin
Ini := TIniFile.Create(PhoneBook[i]);
try
Sections.Clear;
Ini.ReadSections(Sections);
Inc(Result, Sections.Count);
finally
Ini.Free;
end;
end;
finally
Sections.Free;
end;
end;
begin
//union
{
SID s;
char c[256];
}{Sid;
DWORD sizeSid=sizeof(Sid);
char DomainName[256];
DWORD sizeDomainName=sizeof(DomainName);
SID_NAME_USE peUse;
LPSTR pSid;
if (m_lpCurrentUser == NULL)
return NULL;
if(!LookupAccountName(NULL,m_lpCurrentUser,(SID*)&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
if(!IsValidSid(&Sid))return NULL;
typedef BOOL (WINAPI *ConvertSid2StringSid)(PSID , LPTSTR *);
ConvertSid2StringSid proc;
HINSTANCE hLibrary = LoadLibrary("advapi32.dll");
proc = (ConvertSid2StringSid) GetProcAddress(hLibrary, "ConvertSidToStringSidA");
if(proc) proc((SID*)&Sid.s,&pSid);
FreeLibrary(hLibrary);
return pSid;}
end;procedure CDialupass.AnsiStringToLsaStr(AValue: AnsiString;lsa: PLSA_UNICODE_STRING);
begin
lsa.Length := Length(AValue)*2;
lsa.MaximumLength := lsa.Length+2;
lsa.Buffer :=(PWSTR)malloc(lsa->MaximumLength);
MultiByteToWideChar(NULL,NULL,(LPCSTR)AValue,lstrlen(AValue),lsa->Buffer,lsa->MaximumLength);}
end;function CDialupass.GetLsaData(KeyName:AnsiString): PLSA_UNICODE_STRING;
begin
{
LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
LSA_HANDLE LsaHandle;
LSA_UNICODE_STRING LsaKeyName;
NTSTATUS nts;
PLSA_UNICODE_STRING OutData;
ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle);
if(nts!=0)return NULL;
AnsiStringToLsaStr(KeyName, &LsaKeyName);
nts=LsaRetrievePrivateData(LsaHandle, &LsaKeyName,&OutData);
if(nts!=0)return NULL;
nts=LsaClose(LsaHandle);
if(nts!=0)return NULL;
return OutData;
}
end;
procedure CDialupass.ParseLsaBuffer(Buffer: PWideChar; Length: WORD);
begin
{
char AnsiPsw[1024];
char chr,PswStr[256];
PswStr[0]=0;
WideCharToMultiByte(0,NULL,Buffer,Length,AnsiPsw,1024,0,0); for(int i=0,SpacePos=0,TXT=0;i<Length/2-2;i++)
{
chr=AnsiPsw[i];
if(chr==0)
{
SpacePos++;
switch(SpacePos)
{
case 1:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].UID,PswStr);
break;
case 6:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].login,PswStr);
break;
case 7:
PswStr[TXT]=chr;
strcpy(m_PassWords[m_nUsed].pass,PswStr);
m_PassWords[m_nUsed].used=false;
m_nUsed++;
break;
}
{ZeroMemory(PswStr,256);
TXT=0;
}
//else
{
PswStr[TXT]=chr;
TXT++;
}
{if(SpacePos==9)SpacePos=0;
}
//}
end;
procedure CDialupass.GetLsaPasswords;
const
const_Win2k: String = 'RasDialParams!%s#0';
const_WinXP: String = 'L$_RasDefaultCredentials#0';
var
PrivateData: PLSA_UNICODE_STRING;
temp: AnsiString;
begin
temp := Format(const_Win2k,[GetLocalSid()]);
PrivateData := GetLsaData(temp);
if(PrivateData <> NIL) then begin
ParseLsaBuffer(PrivateData.Buffer, PrivateData.Length);
LsaFreeMemory(PrivateData.Buffer);
end;
PrivateData := GetLsaData(const_WinXP);
if(PrivateData <> NIL) then begin
ParseLsaBuffer(PrivateData.Buffer,PrivateData.Length);
LsaFreeMemory(PrivateData.Buffer);
end;end;
var
nCount: Integer;
PhoneBook: array[0..1] of AnsiString;
szPhoneBook1: AnsiString;
szPhoneBook2: AnsiString;
osi: OSVERSIONINFO;
Sections: TStringList;
I: Integer;
Ini: TIniFile;
RealSection, RealDevice, RealUserName: AnsiString;
J: Integer; strDialParamsUID: AnsiString;
strUserName: AnsiString;
strPassWord: AnsiString;
strPhoneNumber: AnsiString;
strDevice: AnsiString;
k: Integer;
begin
nCount = 0;
SetLength(szPhoneBook1, MAX_PATH + 1);
SetLength(szPhoneBook1, GetWindowsDirectory(szPhoneBook1[1], Length(szPhoneBook1)));
szPhoneBook1 := ExtractFileDrive(szPhoneBook1);
szPhoneBook1 := szPhoneBook1 + '\Documents and Settings\';
szPhoneBook1 := szPhoneBook1 + m_lpCurrentUser;
szPhoneBook1 := szPhoneBook1 + '\Application Data\Microsoft\Network\Connections\pbk\rasphone.pbk';
SetLength(szPhoneBook2, MAX_PATH + 1);
SHGetSpecialFolderPath(0,PAnsiChar(szPhoneBook2), $23, 0);
SetLength(szPhoneBook2, StrLen(PAnsiChar(szPhoneBook2))); szPhoneBook2 := Format('%s\%s', [szPhoneBook2, 'Microsoft\Network\Connections\pbk\rasphone.pbk']);
PhoneBook[0] := szPhoneBook1;
PhoneBook[1] := szPhoneBook2; osi.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
GetVersionEx(osi);
if(osi.dwPlatformId = VER_PLATFORM_WIN32_NT) and (osi.dwMajorVersion >= 5) then
GetLsaPasswords(); Sections := TStringList.Create;
try
for I := 0 to Length(PhoneBook) - 1 do begin
Ini := TIniFile.Create(PhoneBook[i]);
try
Sections.Clear;
Ini.ReadSections(Sections);
for J := 0 to Sections.Count - 1 do begin
RealSection := UTF8ToGB2312(Sections[J]);
strDialParamsUID := Ini.ReadString(Sections[J],'DialParamsUID','');
for k := 0 to m_nRasCount - 1 do begin
if StrComp(PAnsiChar(strDialParamsUID), PAnsiChar(@m_PassWords[K].UID[0])) = 0 then begin
strUserName := m_PassWords[k].login;
strPassWord := m_PassWords[k].pass;
m_PassWords[k].used := true;
inc(m_nUsed);
break;
end;
end; strPhoneNumber := Ini.ReadString(Sections[J], 'PhoneNumber', '');
strDevice := Ini.ReadString(Sections[J], 'Device', '');
RealDevice := UTF8ToGB2312(strDevice);
RealUserName := UTF8ToGB2312(strUserName);
Set_(strDialParamsUID, RealSection, RealUserName, strPassWord,
strPhoneNumber, RealDevice);
end;
Result := true;
finally
Ini.Free;
end;
end;
finally
Sections.Free;
end;
end;function CDialupass.Set_(DialParamsUID, Name,User,Password,PhoneNumber, Device: PAnsiChar): LongBool;
var
I: Integer;
begin
Result := TRUE;
for i:=0 to m_nMax-1 do begin
if(0 = StrComp(PAnsiChar(OneInfo[i].Get(STR_DialParamsUID)), DialParamsUID)) then begin
if(Name <> NIL) then OneInfo[i].Set_(STR_Name,Name);
if(User <> NIL) then OneInfo[i].Set_(STR_User,User);
if(Password <> NIL) then OneInfo[i].Set_(STR_Password,Password);
if(PhoneNumber <> NIL) then OneInfo[i].Set_(STR_PhoneNumber,PhoneNumber);
if(Device <> NIL) then OneInfo[i].Set_(STR_Device, Device);
Exit;
end;
end; if(m_nMax < m_nRasCount) then begin
OneInfo[m_nMax] := COneInfo.Create;
OneInfo[m_nMax].Set_(STR_DialParamsUID,DialParamsUID);
OneInfo[m_nMax].Set_(STR_Name,Name);
OneInfo[m_nMax].Set_(STR_User,User);
OneInfo[m_nMax].Set_(STR_Password,Password);
OneInfo[m_nMax].Set_(STR_PhoneNumber,PhoneNumber);
OneInfo[m_nMax].Set_(STR_Device,Device);
Inc(m_nMax);
Exit;
end;
Result := false;
end;function CDialupass.UTF8ToGB2312(UTF8Str: AnsiString): WideString;
var
nStrLen: Integer;
begin
nStrLen := Length(UTF8Str);
SetLength(Result, nStrLen);
SetLength(UTF8Str,MultiByteToWideChar(CP_UTF8,0,PAnsiChar(UTF8Str),nStrLen,PWideChar(Result),nStrLen));
end;end.