#include <windows.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include "resource.h"
#define Port_Address 0x378
int bPortOpen;
char szDriverFileName[MAX_PATH];
char DriverName[]="UserPort";
int iBitOut[8];
int iBitIn[8];
HWND hDlg;
BOOL StopDriver()
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
SERVICE_STATUS serviceStatus;
schSCManager = OpenSCManager (NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if (schSCManager == NULL)
{
return FALSE;
}
schService = OpenService (schSCManager,
DriverName,
SERVICE_ALL_ACCESS
);
if (schService == NULL)
{
CloseServiceHandle (schSCManager);
return FALSE;
}
ControlService (schService, SERVICE_CONTROL_STOP, &serviceStatus);
DeleteService (schService);
CloseServiceHandle (schService);
CloseServiceHandle (schSCManager);
return TRUE;
}
BOOL StartDriver()
{
SC_HANDLE schService = NULL;
SC_HANDLE schSCManager;
HANDLE hDriver;
DWORD LastError;
char szMess[300];
char szTmp[MAX_PATH];
lstrcpy(szTmp,szDriverFileName);
szTmp[12] = '\0';
if (lstrcmpi(szTmp,"\\SystemRoot\\")==0)
{
GetWindowsDirectory(szTmp,sizeof(szTmp));
lstrcat(szTmp,szDriverFileName+11);
}
else
lstrcpy(szTmp,szDriverFileName);
schSCManager = OpenSCManager (NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if (schSCManager == NULL)
{
if (GetLastError() == ERROR_ACCESS_DENIED)
MessageBox(hDlg,"You are not authorized to install drivers.\r\nPlase contact your administrator.","UserPort",MB_OK);
else
MessageBox(hDlg,"Unable to start driver!","UserPort",MB_OK);
return FALSE;
}
schService = CreateService (schSCManager, // SCManager database
DriverName, // name of service
DriverName, // name to display
SERVICE_START,//SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER, // service type
SERVICE_SYSTEM_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szDriverFileName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL // no password
);
if (schService == NULL)
{
LastError = GetLastError();
if (LastError == ERROR_SERVICE_EXISTS)
MessageBox(hDlg,"Driver already started!","UserPort",MB_OK);
else if (LastError == ERROR_ACCESS_DENIED)
MessageBox(hDlg,"You are not authorized to install drivers.\r\nPlase contact your administrator.","UserPort",MB_OK);
else
MessageBox(hDlg,"Unable to start driver!","UserPort",MB_OK);
CloseServiceHandle (schSCManager);
return FALSE;
}
StartService (schService, // service identifier
0, // number of arguments
NULL // pointer to arguments
);
CloseServiceHandle (schService);
CloseServiceHandle (schSCManager);
return TRUE;
}
BOOL AddAUMPBtn()
{
char szTemp2[256];
wsprintf(szTemp2,"%X - %X",0x378,0x378);
SendDlgItemMessage(hDlg, IDC_AUMP_LIST_GRANTS,LB_ADDSTRING, 0,(LPARAM)szTemp2);
SetDlgItemText(hDlg,IDC_AUMP_EDIT_ADD,"");
return TRUE;
}
BOOL WINAPI DlgProc(
HWND hWnd, //Handtag till f�nster, 16-bitar
UINT msg, //Meddelande, unsigned int
WPARAM wParam, //Parameter (word), unsigned int
LPARAM lParam ) //Parameter (long), unsigned long int
{
char szTemp[256];
int iTemp;
int nIndex;
int i;
int iByte=0;
switch (msg)
{
case WM_INITDIALOG:
hDlg=hWnd;
bPortOpen=0;
for (i=0;i<=7;i++)
iBitOut[i]=0;
AddAUMPBtn();
SendDlgItemMessage(hDlg, IDC_AUMP_LIST_GRANTS,LB_SETCURSEL, 0,0);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
if (bPortOpen)
{
if (!StopDriver())
{
if (GetLastError() == ERROR_ACCESS_DENIED)
MessageBox(hDlg,"You are not authorized to remove drivers.\r\nPlase contact your administrator.","UserPort",MB_OK);
else
MessageBox(hDlg,"Driver is not installed!","UserPort",MB_OK);
}
EnableWindow(GetDlgItem(hWnd,IDC_BUTTON_OUTPUT_DATA), FALSE);
EnableWindow(GetDlgItem(hWnd,IDC_BUTTON_INPUT_DATA), FALSE);
bPortOpen=FALSE;
}
PostQuitMessage ( 0 );
EndDialog(hWnd,FALSE);
break;
case IDC_BUTTON_START:
if (bPortOpen==0)
{
StartDriver();
EnableWindow(GetDlgItem(hWnd,IDC_BUTTON_OUTPUT_DATA), TRUE);
EnableWindow(GetDlgItem(hWnd,IDC_BUTTON_INPUT_DATA), TRUE);
bPortOpen=1;
}
break;
case IDC_BUTTON_STOP:
if (bPortOpen==1)
{
if (!StopDriver())
{
if (GetLastError() == ERROR_ACCESS_DENIED)
MessageBox(hDlg,"You are not authorized to remove drivers.\r\nPlase contact your administrator.","UserPort",MB_OK);
else
MessageBox(hDlg,"Driver is not installed!","UserPort",MB_OK);
}
EnableWindow(GetDlgItem(hWnd,IDC_BUTTON_OUTPUT_DATA), FALSE);
EnableWindow(GetDlgItem(hWnd,IDC_BUTTON_INPUT_DATA), FALSE);
bPortOpen=0;
}
break;
case IDC_AUMP_EDIT_ADD:
GetDlgItemText(hDlg,IDC_AUMP_EDIT_ADD,szTemp,sizeof(szTemp));
EnableWindow(GetDlgItem(hWnd,IDC_AUMP_BUTTON_ADD), szTemp[0]!='\0');
break;
case IDC_AUMP_LIST_GRANTS:
if (HIWORD(wParam) == LBN_SELCHANGE)
{
nIndex = SendDlgItemMessage(hDlg, IDC_AUMP_LIST_GRANTS,LB_GETCURSEL, 0,0);
SendDlgItemMessage(hDlg, IDC_AUMP_LIST_GRANTS,LB_SETCURSEL, nIndex,0);
EnableWindow(GetDlgItem(hWnd,IDC_AUMP_BUTTON_REMOVE), TRUE);
}
break;
case IDC_CHECKOUTPUT1:
iBitOut[0]=1-iBitOut[0];
break;
case IDC_CHECKOUTPUT2:
iBitOut[1]=1-iBitOut[1];
break;
case IDC_CHECKOUTPUT3:
iBitOut[2]=1-iBitOut[2];
break;
case IDC_CHECKOUTPUT4:
iBitOut[3]=1-iBitOut[3];
break;
case IDC_CHECKOUTPUT5:
iBitOut[4]=1-iBitOut[4];
break;
case IDC_CHECKOUTPUT6:
iBitOut[5]=1-iBitOut[5];
break;
case IDC_CHECKOUTPUT7:
iBitOut[6]=1-iBitOut[6];
break;
case IDC_CHECKOUTPUT8:
iBitOut[7]=1-iBitOut[7];
break;
case IDC_BUTTON_OUTPUT_DATA:
iByte=0;
for (i=0;i<=7;i++)
{
iTemp=pow(2,i);
nIndex=iTemp*iBitOut[i];
iByte=iByte+nIndex;
}
_outp(Port_Address,iByte);
break;
case IDC_BUTTON_INPUT_DATA:
iByte=_inp(Port_Address);
for (i=7;i>=0;i--)
{
nIndex=pow(2,i);
if (iByte>=nIndex)
{
iByte=iByte-nIndex;
iBitIn[i]=1;
}
else iBitIn[i]=0;
}
if (iBitIn[0]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT1,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT1,BST_UNCHECKED);
if (iBitIn[1]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT2,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT2,BST_UNCHECKED);
if (iBitIn[2]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT3,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT3,BST_UNCHECKED);
if (iBitIn[3]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT4,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT4,BST_UNCHECKED);
if (iBitIn[4]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT5,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT5,BST_UNCHECKED);
if (iBitIn[5]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT6,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT6,BST_UNCHECKED);
if (iBitIn[6]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT7,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT7,BST_UNCHECKED);
if (iBitIn[7]==1)
CheckDlgButton(hDlg,IDC_CHECKINPUT8,BST_CHECKED);
else
CheckDlgButton(hDlg,IDC_CHECKINPUT8,BST_UNCHECKED);
default:
return FALSE;
break;
}
break;
default:
return FALSE;
}
return TRUE;
} //DlgProc
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdline,
int nShow )
{
MSG msg;
OSVERSIONINFO osvi;
GetVersionEx(&osvi);
if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) || (osvi.dwPlatformId == VER_PLATFORM_WIN32s))
{
MessageBox(NULL,"UserPort does not work on Windows 3.11/95/98/Me.\r\n\r\nUsermode programs does always have access to ports in Windows 3.11/95/98.\r\nThis program is therefore not needed on these operating systems.","UserPort",MB_OK);
return 0;
}
if (lpszCmdline[0] != '\0')
lstrcpy(szDriverFileName, lpszCmdline);
else
lstrcpy(szDriverFileName,"\\SystemRoot\\System32\\Drivers\\PortAccess.sys");
CreateDialog(
hInstance,
MAKEINTRESOURCE(IDD_USERPORT),
NULL,
(DLGPROC)DlgProc);
SetClassLong(hDlg,GCL_HICON,(long)LoadIcon ( hInstance, MAKEINTRESOURCE(IDI_APP)));
while ( GetMessage ( &msg, NULL, 0, 0 ) )
{
if (IsDialogMessage(hDlg,&msg))
continue;
TranslateMessage ( &msg );
DispatchMessage ( &msg );
}
return 0;
} //WinMain