#include "StdAfx.h"
#include ".\drvwork.h"
SC_HANDLE DriverWork::scm = NULL;
DriverWork::DriverWork(void)
{
}
DriverWork::~DriverWork(void)
{
CloseServiceHandle (scm);
}
BOOL DriverWork::Install(LPCTSTR DriverName,LPCTSTR driverExec,DWORD startType)
{
if(scm == NULL)
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE Service =
CreateService ( scm, // �������� ���������� � SCManager
DriverName, // ��� �������
DriverName, // ��� ������ �� �����
SERVICE_ALL_ACCESS, // �������� ������
SERVICE_KERNEL_DRIVER, // ��� �������
startType, // ��� �������
SERVICE_ERROR_NORMAL, // ��� �������������� ������
driverExec, // ���� � ��������� �����
// ��������� ��������� �� ������������ � ������ NULL
NULL, // �� ���������� ������ ��������
NULL, NULL, NULL, NULL);
if (Service == NULL)
{
// failure
DWORD err = GetLastError();
if (err == ERROR_SERVICE_EXISTS)
{
/* OK. Service already exist */
return TRUE;
}
else
{
// Print additional information
CString str;
str.Format(_T("ERR: Can't create service. Err=%d\n"),err);
AfxMessageBox(str);
}
return FALSE;
}
CloseServiceHandle (Service);
return TRUE;
}
BOOL DriverWork::Remove(LPCTSTR DriverName,LPCTSTR driverExec)
{
if(scm == NULL)
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE Service = OpenService (scm, DriverName, SERVICE_ALL_ACCESS);
if (Service == NULL) // No access to service manager
{
CloseServiceHandle(scm); // Disconnecting from SCM
scm = NULL;
return FALSE;
}
BOOL ret = DeleteService (Service);
if (!ret)
{
// failure
// Print additional information
DWORD err = GetLastError();
CString str;
str.Format(_T("ERR: Can't delete service. Err=%d\n"),err);
AfxMessageBox(str);
}
CloseServiceHandle (Service);
return ret;
}
BOOL DriverWork::Start(LPCTSTR DriverName)
{
if(scm == NULL)
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE Service = OpenService(scm, DriverName, SERVICE_ALL_ACCESS);
if (Service == NULL) // No access to service manager
{
CloseServiceHandle(scm); // Disconnecting from SCM
scm = NULL;
return FALSE;
}
BOOL ret =
StartService( Service, // ����������
0, // ����� ����������
NULL ); // ��������� �� ���������
if (!ret)
{
// failure
DWORD err = GetLastError();
if (err == ERROR_SERVICE_ALREADY_RUNNING)
ret = TRUE; // OK, driver already running
else
{
/* other troubles */
// Print additional information
CString str;
str.Format(_T("ERR: Can't start service. Err=%d\n"),err);
AfxMessageBox(str);
}
}
CloseServiceHandle (Service);
return ret;
}
BOOL DriverWork::Stop(LPCTSTR DriverName)
{
if(scm == NULL)
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE Service = OpenService (scm, DriverName, SERVICE_ALL_ACCESS );
if (Service == NULL) // No access to service manager
{
DWORD err = GetLastError();
CloseServiceHandle(scm); // Disconnecting from SCM
scm = NULL;
return FALSE;
}
SERVICE_STATUS serviceStatus;
BOOL ret =
ControlService(Service, SERVICE_CONTROL_STOP, &serviceStatus);
if (!ret)
{
// failure
// Print additional information
DWORD err = GetLastError();
CString str;
str.Format(_T("ERR: Can't stop service. Err=%d\n"),err);
AfxMessageBox(str);
}
CloseServiceHandle (Service);
return ret;
}
BOOL DriverWork::Exchange(unsigned long ioctlCode, // IOCTL code
PWCHAR pInStr, // Input string
DWORD inStr_size, // Size of input string
PWCHAR pOutStr, // Output string
DWORD outStr_size, // Size of output string
PDWORD BytesReturned) // Returned bytes number
{
HANDLE hHandle =
CreateFile( _T("\\\\.\\HideDriver"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if(hHandle == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("ERR: can not access driver HideDriver !\n"));
return FALSE;
}
if( !DeviceIoControl( hHandle,
ioctlCode,
pInStr, inStr_size, // Input
pOutStr, outStr_size,// Output
BytesReturned,
NULL ) )
{
// failure
// additional information
DWORD err = GetLastError();
CString str;
str.Format(_T("ERR: Can't send information to service. Err=%d\n"),err);
AfxMessageBox(str);
CloseHandle(hHandle);
return FALSE;
}
CloseHandle(hHandle);
return TRUE;
}