#ifndef _PORTTALK_H_
#define _PORTTALK_H_
#include <winioctl.h>
//---------------------------------------------------------------------------
//32768-65535 are reserved for customers
#define PORTTALK_TYPE 40000
// The IOCTRL function codes from 0x800 to 0xFFF are for customer use
#define IOCTL_IOPM_RESTRICT_ALL_ACCESS CTL_CODE(PORTTALK_TYPE, 0x900, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IOPM_ALLOW_EXCUSIVE_ACCESS CTL_CODE(PORTTALK_TYPE, 0x901, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_IOPM CTL_CODE(PORTTALK_TYPE, 0x902, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_ENABLE_IOPM_ON_PROCESSID CTL_CODE(PORTTALK_TYPE, 0x903, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_READ_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x904, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WRITE_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x905, METHOD_BUFFERED, FILE_ANY_ACCESS)
//---------------------------------------------------------------------------
bool OpenPortTalk(void);
void ClosePortTalk(void);
void outportb(unsigned short int PortAddress, unsigned char byte);
unsigned char inportb(unsigned short int PortAddress);
bool InstallPortTalkDriver(void);
bool StartPortTalkDriver(void);
//---------------------------------------------------------------------------
HANDLE PortTalk_Handle; //Handle for PortTalk Driver
void outportb(unsigned short int PortAddress, unsigned char byte)
{
unsigned int error;
DWORD BytesReturned;
unsigned char Buffer[3];
unsigned short * pBuffer;
pBuffer = (unsigned short *)&Buffer[0];
*pBuffer = PortAddress;
Buffer[2] = byte;
error = DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_UCHAR,&Buffer,3,NULL,0,&BytesReturned,NULL);
if(!error)
ShowMessage("Error occured during outportb while talking to PortTalk driver");
}
unsigned char inportb(unsigned short int PortAddress)
{
unsigned int error;
DWORD BytesReturned;
unsigned char Buffer[3];
unsigned short * pBuffer;
pBuffer = (unsigned short *)&Buffer;
*pBuffer = PortAddress;
error = DeviceIoControl(PortTalk_Handle,IOCTL_READ_PORT_UCHAR,&Buffer,2,&Buffer,1,&BytesReturned,NULL);
if(!error)
ShowMessage("Error occured during inportb while talking to PortTalk driver");
return(Buffer[0]);
}
bool OpenPortTalk(void)
{
PortTalk_Handle = CreateFile("\\\\.\\PortTalk",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(PortTalk_Handle == INVALID_HANDLE_VALUE)
{
StartPortTalkDriver();
PortTalk_Handle = CreateFile("\\\\.\\PortTalk",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(PortTalk_Handle == INVALID_HANDLE_VALUE)
return false;
}
return true;
}
void ClosePortTalk(void)
{
CloseHandle(PortTalk_Handle);
}
bool StartPortTalkDriver(void)
{
SC_HANDLE SchSCManager;
SC_HANDLE schService;
BOOL ret;
DWORD err;
SchSCManager = OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(SchSCManager == NULL)
{
if(GetLastError() == ERROR_ACCESS_DENIED)
ShowMessage("安装驱动PortTalk.sys,需要管理员的权限!");
return false;
}
do{
schService = OpenService(SchSCManager,"PortTalk",SERVICE_ALL_ACCESS);
if (schService == NULL)
{
switch(GetLastError())
{
case ERROR_ACCESS_DENIED:
return false;
case ERROR_INVALID_NAME:
return false;
case ERROR_SERVICE_DOES_NOT_EXIST:
InstallPortTalkDriver();
break;
}
}
}while (schService == NULL);
ret = StartService(schService,0,NULL);
if(ret == NULL) return false;
CloseServiceHandle (schService);
return true;
}
bool InstallPortTalkDriver(void)
{
SC_HANDLE SchSCManager;
SC_HANDLE schService;
DWORD err;
CHAR DriverFileName[80];
GetSystemDirectory(DriverFileName, 55);
lstrcat(DriverFileName,"\\Drivers\\PortTalk.sys");
if(!CopyFile("PortTalk.sys", DriverFileName, FALSE))
return false;
SchSCManager = OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
schService = CreateService (SchSCManager,"PortTalk","PortTalk",SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,"System32\\Drivers\\PortTalk.sys",NULL,NULL,NULL,NULL,NULL);
if(schService == NULL)
return false;
CloseServiceHandle (schService);
return true;
}
//---------------------------------------------------------------------------
#endif
- 1
- 2
- 3
前往页