简单的装载、启动、停止、卸载驱动-还是喜欢命令行的感觉。OSR 的 driver Loader比较经典功能强大,但自己前期写潜伏的kit,只需要简单的载入即可,就写了这个小程序。
代码:
/*
* Loaddriver
*By Philomela
* 2011
*See Useage()
*/
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <windef.h>
#define printError printf
char aPath[1024];
char *theDrivername;
//Up the privilege
BOOL up()
{
HANDLE hToken,hProcess;
TOKEN_PRIVILEGES tp;
char *pSEDEBUG="SeDebugPrivilege";
hProcess=GetCurrentProcess();
if (!OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
printError(TEXT("OpenProcessToken")); return FALSE;
}
if (!LookupPrivilegeValue(NULL,pSEDEBUG,&tp.Privileges[0].Luid))
{
printError(TEXT("LookupPrivilegeValue")); //printf("无法找到指定权限:%s",pSEDEBUG);
return FALSE;
}
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
if (AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL) != 0)
return TRUE;
else
{
printError(TEXT("AdjustTokenPrivileges"));
return FALSE;
}
}
BOOL _util_load_sysfile(char *theDrivername)
{
char aPath[1024];
char aCurrentDirectory[515];
SC_HANDLE rh;
SC_HANDLE sh = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (!sh)
return FALSE;
rh = CreateService(sh,theDrivername,theDrivername,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,\
SERVICE_ERROR_NORMAL,aPath,NULL,NULL,NULL,NULL,NULL);
if (!rh)
{
printf("Didn`t create a service... %d\n", GetLastError());
if (GetLastError() == ERROR_SERVICE_EXISTS)
{
rh = OpenService(sh,theDrivername,SERVICE_ALL_ACCESS);
if (!rh)
{
printf("Can`t find a Service but it found\n");
CloseHandle(sh);
return FALSE;
}
}
else
{
_tprintf( TEXT("Service all ready on\n") );
CloseHandle(sh);
return FALSE;
}
}
//start the drivers
if(rh)
{
if( 0 == StartService(rh, 0, NULL))
{
if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError())
{
printf("Service already running\n");
}
else
{
printf("Failed on StartService %d\n",GetLastError());
CloseHandle(sh);
CloseHandle(rh);
return FALSE;
}
}
CloseServiceHandle(sh);
CloseServiceHandle(rh);
}
return TRUE;
}
void Usage() {
_tprintf(_T("load x [-r -d -g -s -k] [default -r -g]\n"));
_tprintf(_T("\t -r 注册\n"));
_tprintf(_T("\t -d 取消注册\n"));
_tprintf(_T("\t -g 启动驱动\n"));
_tprintf(_T("\t -s 停止驱动\n"));
_tprintf(_T("\t -k 停止并取消注册\n"));
}
BOOL deleteService(SC_HANDLE sh,SC_HANDLE rh)
{
rh= OpenService(
sh, // SCManager database
theDrivername, // name of service
SERVICE_ALL_ACCESS); // only need DELETE access
if (rh == NULL)
{
_tprintf(_T("OpenService failed (%d)\n"), GetLastError());
return FALSE;
}
if (! DeleteService(rh) )
{
_tprintf(_T("DeleteService failed (%d)\n"), GetLastError());
return FALSE;
}
_tprintf(_T("Delete service succeeded\n"));
return TRUE;
}
BOOL stop(SC_HANDLE sh,SC_HANDLE rh) {
SERVICE_STATUS ssStatus;
rh= OpenService(
sh, // SCManager database
theDrivername, // name of service
SERVICE_ALL_ACCESS); // only need DELETE access
if (! rh) {
_tprintf(_T(" OpenService Failed :%d\n"),GetLastError());
return FALSE;
}
if (! ControlService(
rh, // handle to service
SERVICE_CONTROL_STOP, // control value to send
&ssStatus) ) // address of status info
{
printf("ControlService failed (%d)\n", GetLastError());
return FALSE;
}
_tprintf(_T("Stop service success\n"));
return TRUE;
}
BOOL create(SC_HANDLE sh) {
if (!CreateService(sh,theDrivername,theDrivername,SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,aPath,NULL,NULL,NULL,NULL,NULL) ) {
if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError())
{
_tprintf(_T("Service already running\n"));
return FALSE;
}
else if(ERROR_SERVICE_EXISTS == GetLastError())
{
_tprintf(_T("Service exists\n"));
return FALSE;
}
_tprintf(_T("Failed on CreateService %d\n"),GetLastError());
return FALSE;
}
_tprintf(_T("Create service success\n") );
return TRUE;
}
BOOL run(SC_HANDLE sh,SC_HANDLE rh) {
rh = OpenService(sh,theDrivername,SERVICE_ALL_ACCESS);
if ( StartService(rh, 0, NULL) == 0) {
if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError())
_tprintf(_T("Service already running\n"));
else
_tprintf(_T("Failed on StartService %d\n"),GetLastError());
return FALSE;
}
_tprintf(TEXT("run service success\n"));
return TRUE;
}
void Close(SC_HANDLE sh, SC_HANDLE rh) {
if(sh)
CloseServiceHandle(sh);
if(rh)
CloseServiceHandle(rh);
}
int main(int argc, TCHAR* argv[]) {
char aCurrentDirectory[515];
SC_HANDLE sh = NULL ,rh = NULL;
BOOL d_flag = FALSE, s_flag = FALSE;
BOOL r_flag = TRUE, g_flag = TRUE;
if ( argc < 2 ) {
Usage();
return 1;
}
up();
theDrivername = argv[1];
while ( argc-- > 2) {
if( argv[argc][0] != '-' ) {
Usage();
return 1;
}
switch(argv[argc][1]) {
case 'r':
g_flag = FALSE; //不需要启动驱动
break;
case 'd':
d_flag = TRUE;
break;
case 'g':
g_flag = TRUE;
r_flag = FALSE; //不需要注册
break;
case 's':
s_flag = TRUE;
break;
case 'k':
s_flag = d_flag = TRUE;
break;
default:
Usage();
return 1;
}
}
sh = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (!sh)
return FALSE;
GetCurrentDirectory( 512, aCurrentDirectory);
_snprintf(aPath,1022,"%s\\%s.sys",aCurrentDirectory,theDrivername);
printf("loading %s\n",aPath);
//先判断是否需要停止、反注册驱动
if (s_flag == TRUE)
stop(sh,rh);
if (d_flag == TRUE)
deleteService(sh,rh);
if (s_flag || d_flag) {
// Close(sh,rh);
//_tprintf(_T("\tExit...\n"));
return 0;
}
if (r_flag == TRUE)
create(sh);
if (g_flag == TRUE)
run(sh,rh);
Close(sh,rh);
return 0;
}