📄 tdriver.cpp
字号:
driverName, // nombre del servicio
driverName, // nombre a mostrar
SERVICE_ALL_ACCESS, // acceso total
SERVICE_KERNEL_DRIVER, // driver del kernel
SERVICE_DEMAND_START, // comienzo bajo demanda
SERVICE_ERROR_NORMAL, // control de errores normal
driverPath, // path del driver
NULL, // no pertenece a un grupo
NULL, // sin tag
NULL, // sin dependencias
NULL, // cuenta local del sistema
NULL // sin password
);
}
//if i cant create, first i check if the driver already was loaded.
if (SCService == NULL)
{
SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
if (SCService == NULL)
retCode = DRV_ERROR_SERVICE;
}
CloseServiceHandle(SCService);
SCService=NULL;
CloseServiceHandle(SCManager);
SCManager = NULL;
//if all ok, update the state and start if necessary
if(retCode == DRV_SUCCESS)
{
loaded = TRUE;
if(start)
retCode = StartDriver();
}
return retCode;
}
//Function to Unload a driver
DWORD TDriver::UnloadDriver(BOOL forceClearData)
{
DWORD retCode = DRV_SUCCESS;
//if the driver is started, first i will stop it
if (started)
{
if ((retCode = StopDriver()) == DRV_SUCCESS)
{
//i only remove it, if it is mark to be removable
if(removable)
{
//open service and delete it
SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (SCManager == NULL)
return DRV_ERROR_SCM;
SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
if (SCService != NULL)
{
if(!DeleteService(SCService))
retCode = DRV_ERROR_REMOVING;
else
retCode = DRV_SUCCESS;
}
else
retCode = DRV_ERROR_SERVICE;
CloseServiceHandle(SCService);
SCService = NULL;
CloseServiceHandle(SCManager);
SCManager = NULL;
//if all ok, update the state
if(retCode == DRV_SUCCESS)
loaded = FALSE;
}
}
}
//if the driver is initialized...
if(initialized)
{
//if there was some problem but i mark foreceClear, i will remove the data
if(retCode != DRV_SUCCESS && forceClearData == FALSE)
return retCode;
//update the state
initialized = FALSE;
//free memory
if(driverPath != NULL)
{
free(driverPath);
driverPath = NULL;
}
if(driverDosName != NULL)
{
free(driverDosName);
driverDosName = NULL;
}
if(driverName != NULL)
{
free(driverName);
driverName = NULL;
}
}
return retCode;
}
//Function to start the driver "service"
DWORD TDriver::StartDriver(void)
{
//if already started, all ok
if(started)
return DRV_SUCCESS;
//open the service manager and the service and change driver state
SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
DWORD retCode;
if (SCManager == NULL)
return DRV_ERROR_SCM;
SC_HANDLE SCService = OpenService(SCManager,
driverName,
SERVICE_ALL_ACCESS);
if (SCService == NULL)
return DRV_ERROR_SERVICE;
if (!StartService( SCService, 0, NULL))
{
//if the driver was started before i try to do it,
//i will not remove, because it was created by other application
if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
{
removable = FALSE;
retCode = DRV_SUCCESS;
}
else
retCode = DRV_ERROR_STARTING;
}
else
retCode = DRV_SUCCESS;
CloseServiceHandle(SCService);
SCService = NULL;
CloseServiceHandle(SCManager);
SCManager = NULL;
//update the state and open device
if(retCode == DRV_SUCCESS)
{
started = TRUE;
retCode = OpenDevice();
}
return retCode;
}
//Function to stop driver "service"
DWORD TDriver::StopDriver(void)
{
//if already stopped, all ok
if(!started)
return DRV_SUCCESS;
//open the service manager and the service and change driver state
SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
DWORD retCode;
if (SCManager == NULL)
return DRV_ERROR_SCM;
SERVICE_STATUS status;
SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
if (SCService != NULL)
{
//close the driver handle too
CloseHandle(driverHandle);
driverHandle = NULL;
if(!ControlService(SCService, SERVICE_CONTROL_STOP, &status))
retCode = DRV_ERROR_STOPPING;
else
retCode = DRV_SUCCESS;
}
else
retCode = DRV_ERROR_SERVICE;
CloseServiceHandle(SCService);
SCService = NULL;
CloseServiceHandle(SCManager);
SCManager = NULL;
//update the state
if(retCode == DRV_SUCCESS)
started = FALSE;
return retCode;
}
//Funtion to open a driver handle
DWORD TDriver::OpenDevice(void)
{
//if i already have a handle, first close it
if (driverHandle != NULL)
CloseHandle(driverHandle);
driverHandle = CreateFile(driverDosName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(driverHandle == INVALID_HANDLE_VALUE)
return DRV_ERROR_INVALID_HANDLE;
return DRV_SUCCESS;
}
//Return the driverHandle obtained
HANDLE TDriver::GetDriverHandle(void)
{
return driverHandle;
}
//Funtion to send data to the driver
DWORD TDriver::WriteIo(DWORD code, PVOID buffer, DWORD count)
{
if(driverHandle == NULL)
return DRV_ERROR_INVALID_HANDLE;
DWORD bytesReturned;
BOOL returnCode = DeviceIoControl(driverHandle,
code,
buffer,
count,
NULL,
0,
&bytesReturned,
NULL);
if(!returnCode)
return DRV_ERROR_IO;
return DRV_SUCCESS;
}
//Functions to read data from the driver
DWORD TDriver::ReadIo(DWORD code, PVOID buffer, DWORD count)
{
if(driverHandle == NULL)
return DRV_ERROR_INVALID_HANDLE;
DWORD bytesReturned;
BOOL retCode = DeviceIoControl(driverHandle,
code,
NULL,
0,
buffer,
count,
&bytesReturned,
NULL);
if(!retCode)
return DRV_ERROR_IO;
return bytesReturned;
}
//Function to do IO operation with the driver, read or write or both
DWORD TDriver::RawIo(DWORD code, PVOID inBuffer, DWORD inCount, PVOID outBuffer, DWORD outCount)
{
if(driverHandle == NULL)
return DRV_ERROR_INVALID_HANDLE;
DWORD bytesReturned;
BOOL retCode = DeviceIoControl(driverHandle,
code,
inBuffer,
inCount,
outBuffer,
outCount,
&bytesReturned,
NULL);
if(!retCode)
return DRV_ERROR_IO;
return bytesReturned;
}
unsigned long TDriver::inet_addr(const char *sIp)
{
int octets[4];
int i;
const char * auxCad = sIp;
unsigned long lIp = 0;
//we extract each octet of the ip address
//atoi will get characters until it found a non numeric character(in our case '.')
for(i = 0; i < 4; i++)
{
octets[i] = atoi(auxCad);
if(octets[i] < 0 || octets[i] > 255)
return 0;
lIp |= (octets[i] << (i*8));
//update auxCad to point to the next octet
auxCad = strchr(auxCad, '.');
if(auxCad == NULL && i!=3)
return -1;
auxCad++;
}
return lIp;
}
unsigned short TDriver::htons(unsigned short port)
{
unsigned short portRet;
portRet = ((port << 8) | (port >> 8));
return portRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -