format pe gui 4.0

include 'win32ax.inc'

entry main

RAS_MaxEntryNamev4	EQU 256
RAS_MaxEntryNamev3	EQU 20
RAS_MaxPhoneNumber	EQU 128
RAS_MaxCallbackNumberv4 EQU RAS_MaxPhoneNumber
RAS_MaxCallbackNumberv3 EQU 48
UNLEN			EQU 256
PWLEN			EQU 256
DNLEN			EQU 15

struct RASENTRYNAMEAv5
       dwSize		dd  sizeof.RASENTRYNAMEA
       szEntryName	db  RAS_MaxEntryNamev4 + 1 dup(0)
       dwFlags		dd  ? ; If xp and greater
       szPhonebookPath	db  MAX_PATH + 1 dup(0)
       szPadding	db  6 dup(0)
ends

struct RASENTRYNAMEAv4
       dwSize		dd  sizeof.RASENTRYNAMEA
       szEntryName	db  RAS_MaxEntryNamev3 + 1 dup(0)
ends

struct	RASDIALPARAMSAv400
       dwSize		 dd sizeof.RASDIALPARAMSA
       szEntryName	 db RAS_MaxEntryNamev4 + 1 dup (0)
       szPhoneNumber	 db RAS_MaxPhoneNumber + 1 dup (0)
       szCallbackNumber  db RAS_MaxCallbackNumberv4 + 1 dup(0)
       szUserName	 db UNLEN + 1 dup(0)
       szPassword	 db PWLEN + 1 dup(0)
       szDomain 	 db DNLEN + 1 dup(0)
ends

struct	RASDIALPARAMSAv401
       dwSize		 dd sizeof.RASDIALPARAMSAv401
       szEntryName	 db RAS_MaxEntryNamev4 + 1 dup (0)
       szPhoneNumber	 db RAS_MaxPhoneNumber + 1 dup (0)
       szCallbackNumber  db RAS_MaxCallbackNumberv4 + 1 dup(0)
       szUserName	 db UNLEN + 1 dup(0)
       szPassword	 db PWLEN + 1 dup(0)
       szDomain 	 db DNLEN + 1 dup(0)
       dwSubEntry	 dd ?
       dwCallbackId	 dd ?  ; on 64-bit it's QUADWORD
ends

struct	RASDIALPARAMSAv61
       dwSize		 dd sizeof.RASDIALPARAMSAv61
       szEntryName	 db RAS_MaxEntryNamev4 + 1 dup (0)
       szPhoneNumber	 db RAS_MaxPhoneNumber + 1 dup (0)
       szCallbackNumber  db RAS_MaxCallbackNumberv4 + 1 dup(0)
       szUserName	 db UNLEN + 1 dup(0)
       szPassword	 db PWLEN + 1 dup(0)
       szDomain 	 db DNLEN + 1 dup(0)
       dwSubEntry	 dd ?
       dwCallbackId	 dd ?  ; on 64-bit it's QUADWORD
       dwIfIndex	 dd ?  ; Windows 7 over
ends


section '.data' data readable writeable

	align 4

	rasEntName	   RASENTRYNAMEA
	dwCb		   dd	   0 ; dynamically determine the size of which version of RASENTRYNAMEA to use
	dwEntries	   dd	   0
	rasDialParamsv400  RASDIALPARAMSAv400
	rasDialParamsv401  RASDIALPARAMSAv401
	rasDialParamsv61   RASDIALPARAMSAv61
	fPass		   dd	   FALSE
	hConn		   dd	   NULL

	szFormat	db	'Error: %u',13,10,13,10
			db	'Error codes: http://msdn.microsoft.com/en-us/library/windows/desktop/bb530704(v=vs.85).aspx',0
	szBuffer	db	$ - szFormat + 12
	nSize		dd	NULL
section '.code' code readable executable


main:
	push	dwEntries
	push	dwCb
	push	rasEntName
	push	NULL
	push	NULL
	call	[RasEnumEntriesA]
	test	eax,	eax
	jne	.fail

	lea	eax,	dword[rasEntName.szEntryName]
	lea	ecx,	dword[rasDialParams.szEntryName]

	push	eax
	push	ecx
	call	[lstrcpyA]    ; Or lstrcpW

	push	fPass
	push	rasDialParams
	push	NULL
	call	[RasGetEntryDialParamsA]

	push	hConn
	push	NULL
	push	0
	push	rasDialParams
	push	NULL
	push	NULL
	call	[RasDialA]
	test	eax,	eax
	jne	.fail

	push	0
	push	0
	call	.message_ok
	db	'Successful',0
.message_ok:
	push	0
	call	[MessageBoxA]

	jmp	.exit
.fail:
	push	eax
	push	szFormat
	push	szBuffer
	call	[wsprintfA]
	add	esp,	3 * 4

	push	0
	push	0
	push	szBuffer
	push	0
	call	[MessageBoxA]

.exit:
	push	0
	call	[ExitProcess]

	nop

section '.idata' import data readable

library user32,'user32.dll',\
	kernel32,'kernel32.dll',\
	rasapi32,'rasapi32.dll'

import	user32,\
	MessageBoxA,'MessageBoxA',\
	wsprintfA,'wsprintfA'

import	kernel32,\
	ExitProcess,'ExitProcess',\
	lstrcpyA,'lstrcpyA',\
	FormatMessageA,'FormatMessageA'

import	rasapi32,\
	RasGetEntryDialParamsA,'RasGetEntryDialParamsA',\
	RasEnumEntriesA,'RasEnumEntriesA',\
	RasDialA,'RasDialA'

