驱动加载

steak 14天前 157

import win.ui;
/*DSG{{*/
mainForm = win.form(text="AA驱动加载";right=470;bottom=358;acceptfiles=1)
mainForm.add(
button={cls="button";text="安装";left=15;top=87;right=76;bottom=111;edge=1;frame=1;z=5};
button2={cls="button";text="启动";left=105;top=87;right=166;bottom=111;edge=1;frame=1;z=6};
button3={cls="button";text="停止";left=195;top=87;right=256;bottom=111;edge=1;frame=1;z=7};
button4={cls="button";text="卸载";left=284;top=87;right=345;bottom=111;edge=1;frame=1;z=8};
button5={cls="button";text="关闭";left=374;top=87;right=435;bottom=111;edge=1;frame=1;z=9};
edit={cls="edit";left=77;top=33;right=402;bottom=61;edge=1;multiline=1;z=4};
edit2={cls="edit";left=36;top=184;right=391;bottom=312;edge=1;multiline=1;z=13};
groupbox={cls="groupbox";left=2;top=114;right=458;bottom=154;edge=1;z=11};
groupbox2={cls="groupbox";left=3;top=79;right=458;bottom=118;edge=1;z=3};
groupbox3={cls="groupbox";left=3;top=17;right=457;bottom=80;edge=1;z=2};
groupbox4={cls="groupbox";left=1;top=6;right=461;bottom=158;edge=1;z=1};
static={cls="static";text="驱动路径:";left=12;top=37;right=74;bottom=51;transparent=1;z=10};
static2={cls="static";left=8;top=126;right=444;bottom=151;transparent=1;z=12}
)
/*}}*/

import process; 
import fsys.dlg;
				
OpenSCManager=::Advapi32.api("OpenSCManagerW","ptr(
			ustring lpMachineName,
			ustring lpDatabaseName,
			INT dwDesiredAccess
)")
CreateService=::Advapi32.api("CreateServiceW","ptr(
			ptr hSCManager, 
			ustring lpServiceName, 
			ustring lpDisplayName, 
			INT dwDesiredAccess, 
			INT dwServiceType,
			INT dwStartType, 
			INT dwErrorControl,
			ustring lpBinaryPathName, 
			ustring lpLoadOrderGroup,
			ustring lpdwTagId, 
			ustring lpDependencies,
			ustring lpServiceStartName, 
			ustring lpPassword
)");						

StartService=::Advapi32.api("StartServiceW","int(
 			ptr hService,
 			INT dwNumServiceArgs,
 			string lpServiceArgVectors
)"); 
OpenService =::Advapi32.api("OpenServiceW","ptr(
 			ptr hSCManager,
 			ustring lpServiceName,
 			INT dwDesiredAccess
)"); 			
CloseServiceHandle=::Advapi32.api("CloseServiceHandle","int(
			ptr hSCObject
)");

ControlService=::Advapi32.api("ControlService","int(
 			ptr hService,
 			INT dwControl,
 			struct lpServiceStatus
)"); 
DeleteService=::Advapi32.api("DeleteService","int(
			ptr hSCObject
)");
DeviceIoControl = ::Kernel32.api("DeviceIoControl","int(
			pointer hDevice,
			INT dwIoControlCode,
			pointer lpInBuffer,
			INT nInBufferSize,
			pointer lpOutBuffer,
			INT nOutBufferSize,
			INT& lpBytesReturned,
			prt lpOverlapped
)"); 

class SERVICE_STATUS {
	INT dwServiceType;
	INT dwCurrentState;
	INT dwControlsAccepted;
	INT dwWin32ExitCode;
 	INT dwServiceSpecificExitCode;
 	INT dwCheckPoint;
 	INT dwWaitHint;
}

安装=function(path){	
	handle=OpenSCManager(null,null,0xF003F/*_SC_MANAGER_ALL_ACCESS*/)
 	if handle == null{
 		mainForm.static2.text=lasterr()
 		return ; 
 	}
 	mainForm.edit2.print("SCM",handle)
 	
 	hServer=CreateService(handle,
 			"TitanHide",
 			"TitanHide",
 			0xF01FF/*_SERVICE_ALL_ACCESS*/,
 			0x1/*_SERVICE_KERNEL_DRIVER*/,
 			0x3/*_SERVICE_DEMAND_START*/,
 			0x0/*_SERVICE_ERROR_IGNORE*/,
 			"I:\work\ring0\titanhide.sys",
 			null,
 			null,
 			null,
 			null,
 			null
 	)
 	mainForm.edit2.print(hServer)
 	if hServer == null { 		
 		select(GetLastError()) {
 			case 5/*_ERROR_ACCESS_DENIED*/ {
 				mainForm.static2.text="拒绝访问" 					
 				CloseServiceHandle(handle)
 				return -1; 
 			}
 			case 0x431/*_ERROR_SERVICE_EXISTS*/ {
 				hServer = OpenService(handle,"TitanHide", 0xF0003/*_SERVER_ALL_ACCESS*/);
 				if (hServer == NULL){
					return -1;
				}
 			}
 			case 0x7B/*_ERROR_INVALID_NAME*/{
 				mainForm.static2.text="指定的服务名称无效"
 				return -1;
 			}
 			case 6/*_ERROR_INVALID_HANDLE*/{
 				mainForm.static2.text="指定的服务控制管理器数据库的句柄无效。"
 				return -1;
 			}
 			else{
 				mainForm.static2.text="错误"
 				CloseServiceHandle(handle)
 				return -2; 
 			} 			
 		} 		
 	}
 	mainForm.static2.text="驱动服务安装成功"
 	CloseServiceHandle(handle)
 	CloseServiceHandle(hServer)
}
启动=function(hServer){
	if type(hServer)=="pointer"{
		if !StartService(hServer,0,null){
 			//mainForm.static2.text="启动驱动失败"
 			select(GetLastError()) {
 				case 5/*_ERROR_ACCESS_DENIED*/ {
 					mainForm.static2.text="句柄没有SERVICE_START访问权限。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 6/*_ERROR_INVALID_HANDLE*/ {
 					mainForm.static2.text="该句柄无效。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 3/*_ERROR_PATH_NOT_FOUND*/ {
 					mainForm.static2.text="找不到服务二进制文件。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x420/*_ERROR_SERVICE_ALREADY_RUNNING*/ {
 					mainForm.static2.text="服务的实例已运行。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x41F/*_ERROR_SERVICE_DATABASE_LOCKED*/ {
 					mainForm.static2.text="数据库已锁定。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x433/*_ERROR_SERVICE_DEPENDENCY_DELETED*/ {
 					mainForm.static2.text="该服务取决于不存在或标记为要删除的服务。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x42C/*_ERROR_SERVICE_DEPENDENCY_FAIL*/ {
 					mainForm.static2.text="该服务依赖于另一个未能启动的服务。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x422/*_ERROR_SERVICE_DISABLED*/ {
 					mainForm.static2.text="服务已被禁用。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x42D/*_ERROR_SERVICE_LOGON_FAILED*/ {
 					mainForm.static2.text="由于登录失败而无法启动服务。 如果服务配置为在没有“以服务身份登录”的帐户下运行,则会发生此错误"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x430/*_ERROR_SERVICE_MARKED_FOR_DELETE*/ {
 					mainForm.static2.text="服务已被标记为要删除。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x41E/*_ERROR_SERVICE_NO_THREAD*/ {
 					mainForm.static2.text="无法为服务创建线程。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x41D/*_ERROR_SERVICE_REQUEST_TIMEOUT*/ {
 					mainForm.static2.text="服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能在控制处理程序函数中被阻止。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 			} 			
 		}
 	} 	
}

停止=function(hServer){	
	if type(hServer)="point"{
		if !ControlService(hServer,1/*_SERVICE_CONTROL_STOP*/,status){
			select(GetLastError()) {
				case 0x426/*_ERROR_SERVICE_NOT_ACTIVE*/ {
					mainForm.static2.text="该服务尚未启动。"
 					return -1;
				}
				case 0x41B/*_ERROR_DEPENDENT_SERVICES_RUNNING*/ {
					mainForm.static2.text="无法停止该服务,因为其他正在运行的服务依赖于它。"
 					return -1;
				}
				case 5/*_ERROR_ACCESS_DENIED*/ {
					mainForm.static2.text="句柄没有所需的访问权限"
 					return -1;
				}
				case 0x57/*_ERROR_INVALID_PARAMETER*/ {
					mainForm.static2.text="请求的控制代码未定义。"
 					return -1;
				}
				case 0x41D/*_ERROR_SERVICE_REQUEST_TIMEOUT*/{
					mainForm.static2.text="服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能会在控制处理程序函数中被阻止。"
 					return -1;
				}
				case 0x45B/*_ERROR_SHUTDOWN_IN_PROGRESS*/ {
					mainForm.static2.text="系统正在关闭。"
 					return -1;
				}
			}
		}
	}
}

卸载=function(name){
	hServer=打开服务("TitanHide")
	mainForm.edit2.print(type(hServer))
	if type(hServer)=="pointer"{		
		if !DeleteService(hServer){
			select(GetLastError()) {
				case 5/*_ERROR_ACCESS_DENIED*/ {
					mainForm.static2.text="句柄没有 DELETE 访问权限。"	
				}
				case 6/*_ERROR_INVALID_HANDLE*/ {
					mainForm.static2.text="指定的句柄无效。"
				}
				case 0x430/*_ERROR_SERVICE_MARKED_FOR_DELETE*/ {
					mainForm.static2.text="指定的服务已被标记为要删除。"
				}				
			}
		}
		mainForm.static2.text="删除驱动服务安装成功"
		CloseServiceHandle(hServer)
	}
}

打开服务=function(name){
	var handle=OpenSCManager(null,null,0xF003F/*_SC_MANAGER_ALL_ACCESS*/)
	if handle == null{
 		//mainForm.static2.text=lasterr()
 		CloseServiceHandle(handle)
 		return -6; 
 	}
	var hServer = OpenService(handle,name, 0xF0003/*_SERVER_ALL_ACCESS*/);
 	if (hServer == NULL){
 		//mainForm.edit2.print(GetLastError()) 		
 		select(GetLastError()) {
 			case 0x424/*_ERROR_SERVICE_DOES_NOT_EXIST*/ {
 				mainForm.static2.text="指定的服务不存在。"
 				CloseServiceHandle(handle)
 				return -1 ; 
 			}
 			case 5/*_ERROR_ACCESS_DENIED*/ {
 				mainForm.static2.text="句柄无权访问服务。"
 				CloseServiceHandle(handle)
 				return -2;
 			}
 			case 6/*_ERROR_INVALID_HANDLE*/ {
 				mainForm.static2.text="指定的句柄无效。"
 				CloseServiceHandle(handle)
 				return -3;
 			}
 			case 0x7B/*_ERROR_INVALID_NAME*/ {
 				mainForm.static2.text="指定的服务名称无效。"
 				CloseServiceHandle(handle)
 				return -4;
 			} 			
 		}
 	}else{
 		CloseServiceHandle(handle)
 		return hServer; 
 	}	
}
控制服务=function(hServer,code){
	if code==null{
		return -1; 
	}
	/*控制代码 128~255 自定义代码
	1 通知服务应停止。 hService 句柄必须具有SERVICE_STOP访问权限。将停止请求发送到服务后,不应将其他控件发送到服务。
	2 通知服务应暂停。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。
	3 通知暂停的服务应恢复。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。
	4 通知服务应将其当前状态信息报告给服务控制管理器。 hService 句柄必须具有SERVICE_INTERROGATE访问权限。请注意,此控件通常不有用,因为 SCM 知道服务的当前状态。
	6 通知服务其启动参数已更改。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。
	7 通知网络服务有一个新组件用于绑定。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	8 通知网络服务已删除绑定组件。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	9 通知网络服务已启用禁用的绑定。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	a 通知网络服务已禁用其中一个绑定。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	*/
	var ptr=SERVICE_STATUS()//创建一个结构体对象
		
	//ptr=topointer(ptr)
	//prt=raw.convert(ptr,)
	//ptr=raw.realloc(60)
	mainForm.edit2.print(type(ptr))	
	hServer=打开服务("TitanHide")
	
	mainForm.edit2.dump(hServer)
	if type(hServer)=="pointer"{	
		if !ControlService(hServer,1/*_SERVICE_CONTROL_STOP*/,ptr){
			select(GetLastError()) {
				case 0x426/*_ERROR_SERVICE_NOT_ACTIVE*/ {
					mainForm.static2.text="该服务尚未启动。"
 					return -1;
				}
				case 0x41B/*_ERROR_DEPENDENT_SERVICES_RUNNING*/ {
					mainForm.static2.text="无法停止该服务,因为其他正在运行的服务依赖于它。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 5/*_ERROR_ACCESS_DENIED*/ {
					mainForm.static2.text="句柄没有所需的访问权限"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x57/*_ERROR_INVALID_PARAMETER*/ {
					mainForm.static2.text="请求的控制代码未定义。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x41D/*_ERROR_SERVICE_REQUEST_TIMEOUT*/{
					mainForm.static2.text="服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能会在控制处理程序函数中被阻止。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x45B/*_ERROR_SHUTDOWN_IN_PROGRESS*/ {
					mainForm.static2.text="系统正在关闭。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 6/*_ERROR_INVALID_HANDLE*/ {
					mainForm.static2.text="指定的句柄未使用 CreateService 或 OpenService 获取,或者句柄不再有效。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x425/*_ERROR_SERVICE_CANNOT_ACCEPT_CTRL*/ {
					mainForm.static2.text="由于服务的状态 为SERVICE_STOPPED、 SERVICE_START_PENDING或 SERVICE_STOP_PENDING,因此无法将请求的控制代码发送到服务。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x41C/*_ERROR_INVALID_SERVICE_CONTROL*/ {
					mainForm.static2.text="请求的控制代码无效或服务无法接受该控制代码"
					CloseServiceHandle(hServer)
 					return -1;
				}
			}		
		}
	}	
}



mainForm.button.oncommand = function(id,event){
	安装()
}

mainForm.button2.oncommand = function(id,event){
	hServer=打开服务("TitanHide")
	启动(hServer)
}

mainForm.edit.oncommand = function(id,event){
	if path==null{
		path=fsys.dlg.open("*.sys","选择驱动文件","c:\")	
		mainForm.edit.text=path
	}	
	return ; 
}

mainForm.button4.oncommand = function(id,event){	
	ret=卸载(hServer)
	mainForm.edit2.print(ret)
}
mainForm.onDropFiles = function(files){
	//mainForm.edit2.print(files[1])
	mainForm.edit.text=files[1]
}

mainForm.button3.oncommand = function(id,event){
	控制服务("TitanHide",1)
}
mainForm.show();
return win.loopMessage();

/**
loaddriver=function(path){
	
	//hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);	
	OpenSCManager=::Advapi32.api("OpenSCManagerW","ptr(
						ustring lpMachineName,
						ustring lpDatabaseName,
						INT dwDesiredAccess
	)")
	CreateService=::Advapi32.api("CreateServiceW","ptr(
				ptr hSCManager, 
				ustring lpServiceName, 
				ustring lpDisplayName, 
				INT dwDesiredAccess, 
				INT dwServiceType,
				INT dwStartType, 
				INT dwErrorControl,
				ustring lpBinaryPathName, 
				ustring lpLoadOrderGroup,
				ustring lpdwTagId, 
				ustring lpDependencies,
				ustring lpServiceStartName, 
				ustring lpPassword
				)");						
	
	StartService=::Advapi32.api("StartServiceW","int(
 						ptr hService,
 						INT dwNumServiceArgs,
 						string lpServiceArgVectors
				)"); 
	OpenService =::Advapi32.api("OpenServiceW","ptr(
 						ptr hSCManager,
 						ustring lpServiceName,
 						INT dwDesiredAccess
				)"); 			
	CloseServiceHandle=::Advapi32.api("CloseServiceHandle","int(
						 ptr hSCObject
				)");

	ControlService=::Advapi32.api("ControlService","int(
 						ptr hService,
 						INT dwControl,
 						pointer lpServiceStatus
				)"); 
	DeleteService=::Advapi32.api("DeleteService","int(
						 ptr hSCObject
				)");
	
		

 	/*
 	dwServiceType 服务类型有
 		SERVICE_ADAPTER
		0x00000004
		保留。
		SERVICE_FILE_SYSTEM_DRIVER
		0x00000002
		文件系统驱动程序服务。
		SERVICE_KERNEL_DRIVER
		0x00000001
		驱动程序服务。
		SERVICE_RECOGNIZER_DRIVER
		0x00000008
		保留。
		SERVICE_WIN32_OWN_PROCESS
		0x00000010
		在其自己的进程中运行的服务。
		SERVICE_WIN32_SHARE_PROCESS
		0x00000020
		与一个或多个其他服务共享进程的服务	
 	
 	dwStartType参数有
 		SERVICE_AUTO_START
		0x00000002
		在系统启动期间服务控制管理器自动启动的服务。 有关详细信息,请参阅 “自动启动服务”。
		SERVICE_BOOT_START
		0x00000000
		系统加载程序启动的设备驱动程序。 此值只对驱动程序服务有效。
		SERVICE_DEMAND_START
		0x00000003
		进程调用 StartService 函数时由服务控制管理器启动的服务。 有关详细信息,请参阅 “按需启动服务”。
		SERVICE_DISABLED
		0x00000004
		无法启动的服务。 尝试启动服务会导致错误代码 ERROR_SERVICE_DISABLED。
		SERVICE_SYSTEM_START
		0x00000001
		IoInitSystem 函数启动的设备驱动程序。 此值只对驱动程序服务有效。	
 	
 	dwErrorControl 参数有
 		SERVICE_ERROR_CRITICAL
		0x00000003
		如果可能,启动程序会在事件日志中记录错误。 如果启动最后一个已知良好的配置,启动操作将失败。 否则,系统会使用上次已知的良好配置重启系统。
		SERVICE_ERROR_IGNORE
		0x00000000
		启动程序将忽略错误并继续启动操作。
		SERVICE_ERROR_NORMAL
		0x00000001
		启动程序在事件日志中记录错误,但会继续启动操作。
		SERVICE_ERROR_SEVERE
		0x00000002
		启动程序在事件日志中记录错误。 如果启动最后一个已知良好的配置,启动操作将继续。 否则,系统会使用最后一个已知良好的配置重启系统。
 	*/
 	
 	handle=OpenSCManager(null,null,0xF003F/*_SC_MANAGER_ALL_ACCESS*/)
 	if handle == null{
 		winform.editChange.print(lasterr())
 		return ; 
 	}
 	//winform.editChange.print(handle)
 	
 	hServer=CreateService(handle,
 			"TitanHide",
 			"TitanHide",
 			0xF01FF/*_SERVICE_ALL_ACCESS*/,
 			0x1/*_SERVICE_KERNEL_DRIVER*/,
 			0x3/*_SERVICE_DEMAND_START*/,
 			0x0/*_SERVICE_ERROR_IGNORE*/,
 			"I:\work\ring0\titanhide.sys",
 			null,
 			null,
 			null,
 			null,
 			null
 	)
 	//winform.editChange.print(hServer)
 	if hServer == null { 		
 		select(GetLastError()) {
 			case 5 {
 				winform.editChange.print("拒绝访问")
 				CloseServiceHandle(handle)
 				return -1; 
 			}
 			case 0x431/*_ERROR_SERVICE_EXISTS*/ {
 				hService = OpenService(handle,"TitanHide", 0xF0003/*_SERVER_ALL_ACCESS*/);
 				if (hService == NULL){
					return -1;
				}
 			}
 			else{
 				mainForm.static2.text="错误"
 				CloseServiceHandle(handle)
 				return -2; 
 			} 			
 		} 		
 	}
 	
 	
 	if !StartService(hServer,0,null){
 		mainForm.static2.text="启动驱动失败"
 		CloseServiceHandle(hServer)
 		CloseServiceHandle(handle)
 		return -3; 
 	}
 	
 	class SERVICE_STATUS {
 		INT dwServiceType;
 		INT dwCurrentState;
 		INT dwControlsAccepted;
 		INT dwWin32ExitCode;
 		INT dwServiceSpecificExitCode;
 		INT dwCheckPoint;
 		INT dwWaitHint;
 	}
 	status=raw.struct(SERVICE_STATUS)
 	ControlService(hServer,1/*_SERVICE_CONTROL_STOP*/,status)
 			
}
**/
import win.ui;
/*DSG{{*/
mainForm = win.form(text="AA驱动加载";right=470;bottom=358;acceptfiles=1)
mainForm.add(
button={cls="button";text="安装";left=15;top=87;right=76;bottom=111;edge=1;frame=1;z=5};
button2={cls="button";text="启动";left=105;top=87;right=166;bottom=111;edge=1;frame=1;z=6};
button3={cls="button";text="停止";left=195;top=87;right=256;bottom=111;edge=1;frame=1;z=7};
button4={cls="button";text="卸载";left=284;top=87;right=345;bottom=111;edge=1;frame=1;z=8};
button5={cls="button";text="关闭";left=374;top=87;right=435;bottom=111;edge=1;frame=1;z=9};
edit={cls="edit";left=77;top=33;right=402;bottom=61;edge=1;multiline=1;z=4};
edit2={cls="edit";left=36;top=184;right=391;bottom=312;edge=1;multiline=1;z=13};
groupbox={cls="groupbox";left=2;top=114;right=458;bottom=154;edge=1;z=11};
groupbox2={cls="groupbox";left=3;top=79;right=458;bottom=118;edge=1;z=3};
groupbox3={cls="groupbox";left=3;top=17;right=457;bottom=80;edge=1;z=2};
groupbox4={cls="groupbox";left=1;top=6;right=461;bottom=158;edge=1;z=1};
static={cls="static";text="驱动路径:";left=12;top=37;right=74;bottom=51;transparent=1;z=10};
static2={cls="static";left=8;top=126;right=444;bottom=151;transparent=1;z=12}
)
/*}}*/

import process; 
import fsys.dlg;
				
OpenSCManager=::Advapi32.api("OpenSCManagerW","ptr(
			ustring lpMachineName,
			ustring lpDatabaseName,
			INT dwDesiredAccess
)")
CreateService=::Advapi32.api("CreateServiceW","ptr(
			ptr hSCManager, 
			ustring lpServiceName, 
			ustring lpDisplayName, 
			INT dwDesiredAccess, 
			INT dwServiceType,
			INT dwStartType, 
			INT dwErrorControl,
			ustring lpBinaryPathName, 
			ustring lpLoadOrderGroup,
			ustring lpdwTagId, 
			ustring lpDependencies,
			ustring lpServiceStartName, 
			ustring lpPassword
)");						

StartService=::Advapi32.api("StartServiceW","int(
 			ptr hService,
 			INT dwNumServiceArgs,
 			string lpServiceArgVectors
)"); 
OpenService =::Advapi32.api("OpenServiceW","ptr(
 			ptr hSCManager,
 			ustring lpServiceName,
 			INT dwDesiredAccess
)"); 			
CloseServiceHandle=::Advapi32.api("CloseServiceHandle","int(
			ptr hSCObject
)");

ControlService=::Advapi32.api("ControlService","int(
 			ptr hService,
 			INT dwControl,
 			struct lpServiceStatus
)"); 
DeleteService=::Advapi32.api("DeleteService","int(
			ptr hSCObject
)");
DeviceIoControl = ::Kernel32.api("DeviceIoControl","int(
			pointer hDevice,
			INT dwIoControlCode,
			pointer lpInBuffer,
			INT nInBufferSize,
			pointer lpOutBuffer,
			INT nOutBufferSize,
			INT& lpBytesReturned,
			prt lpOverlapped
)"); 

class SERVICE_STATUS {
	INT dwServiceType;
	INT dwCurrentState;
	INT dwControlsAccepted;
	INT dwWin32ExitCode;
 	INT dwServiceSpecificExitCode;
 	INT dwCheckPoint;
 	INT dwWaitHint;
}

安装=function(path){	
	handle=OpenSCManager(null,null,0xF003F/*_SC_MANAGER_ALL_ACCESS*/)
 	if handle == null{
 		mainForm.static2.text=lasterr()
 		return ; 
 	}
 	mainForm.edit2.print("SCM",handle)
 	
 	hServer=CreateService(handle,
 			"TitanHide",
 			"TitanHide",
 			0xF01FF/*_SERVICE_ALL_ACCESS*/,
 			0x1/*_SERVICE_KERNEL_DRIVER*/,
 			0x3/*_SERVICE_DEMAND_START*/,
 			0x0/*_SERVICE_ERROR_IGNORE*/,
 			"I:\work\ring0\titanhide.sys",
 			null,
 			null,
 			null,
 			null,
 			null
 	)
 	mainForm.edit2.print(hServer)
 	if hServer == null { 		
 		select(GetLastError()) {
 			case 5/*_ERROR_ACCESS_DENIED*/ {
 				mainForm.static2.text="拒绝访问" 					
 				CloseServiceHandle(handle)
 				return -1; 
 			}
 			case 0x431/*_ERROR_SERVICE_EXISTS*/ {
 				hServer = OpenService(handle,"TitanHide", 0xF0003/*_SERVER_ALL_ACCESS*/);
 				if (hServer == NULL){
					return -1;
				}
 			}
 			case 0x7B/*_ERROR_INVALID_NAME*/{
 				mainForm.static2.text="指定的服务名称无效"
 				return -1;
 			}
 			case 6/*_ERROR_INVALID_HANDLE*/{
 				mainForm.static2.text="指定的服务控制管理器数据库的句柄无效。"
 				return -1;
 			}
 			else{
 				mainForm.static2.text="错误"
 				CloseServiceHandle(handle)
 				return -2; 
 			} 			
 		} 		
 	}
 	mainForm.static2.text="驱动服务安装成功"
 	CloseServiceHandle(handle)
 	CloseServiceHandle(hServer)
}
启动=function(hServer){
	if type(hServer)=="pointer"{
		if !StartService(hServer,0,null){
 			//mainForm.static2.text="启动驱动失败"
 			select(GetLastError()) {
 				case 5/*_ERROR_ACCESS_DENIED*/ {
 					mainForm.static2.text="句柄没有SERVICE_START访问权限。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 6/*_ERROR_INVALID_HANDLE*/ {
 					mainForm.static2.text="该句柄无效。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 3/*_ERROR_PATH_NOT_FOUND*/ {
 					mainForm.static2.text="找不到服务二进制文件。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x420/*_ERROR_SERVICE_ALREADY_RUNNING*/ {
 					mainForm.static2.text="服务的实例已运行。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x41F/*_ERROR_SERVICE_DATABASE_LOCKED*/ {
 					mainForm.static2.text="数据库已锁定。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x433/*_ERROR_SERVICE_DEPENDENCY_DELETED*/ {
 					mainForm.static2.text="该服务取决于不存在或标记为要删除的服务。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x42C/*_ERROR_SERVICE_DEPENDENCY_FAIL*/ {
 					mainForm.static2.text="该服务依赖于另一个未能启动的服务。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x422/*_ERROR_SERVICE_DISABLED*/ {
 					mainForm.static2.text="服务已被禁用。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x42D/*_ERROR_SERVICE_LOGON_FAILED*/ {
 					mainForm.static2.text="由于登录失败而无法启动服务。 如果服务配置为在没有“以服务身份登录”的帐户下运行,则会发生此错误"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x430/*_ERROR_SERVICE_MARKED_FOR_DELETE*/ {
 					mainForm.static2.text="服务已被标记为要删除。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x41E/*_ERROR_SERVICE_NO_THREAD*/ {
 					mainForm.static2.text="无法为服务创建线程。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 				case 0x41D/*_ERROR_SERVICE_REQUEST_TIMEOUT*/ {
 					mainForm.static2.text="服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能在控制处理程序函数中被阻止。"
 					CloseServiceHandle(hServer)
 					CloseServiceHandle(handle)
 					return -1; 
 				}
 			} 			
 		}
 	} 	
}

停止=function(hServer){	
	if type(hServer)="point"{
		if !ControlService(hServer,1/*_SERVICE_CONTROL_STOP*/,status){
			select(GetLastError()) {
				case 0x426/*_ERROR_SERVICE_NOT_ACTIVE*/ {
					mainForm.static2.text="该服务尚未启动。"
 					return -1;
				}
				case 0x41B/*_ERROR_DEPENDENT_SERVICES_RUNNING*/ {
					mainForm.static2.text="无法停止该服务,因为其他正在运行的服务依赖于它。"
 					return -1;
				}
				case 5/*_ERROR_ACCESS_DENIED*/ {
					mainForm.static2.text="句柄没有所需的访问权限"
 					return -1;
				}
				case 0x57/*_ERROR_INVALID_PARAMETER*/ {
					mainForm.static2.text="请求的控制代码未定义。"
 					return -1;
				}
				case 0x41D/*_ERROR_SERVICE_REQUEST_TIMEOUT*/{
					mainForm.static2.text="服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能会在控制处理程序函数中被阻止。"
 					return -1;
				}
				case 0x45B/*_ERROR_SHUTDOWN_IN_PROGRESS*/ {
					mainForm.static2.text="系统正在关闭。"
 					return -1;
				}
			}
		}
	}
}

卸载=function(name){
	hServer=打开服务("TitanHide")
	mainForm.edit2.print(type(hServer))
	if type(hServer)=="pointer"{		
		if !DeleteService(hServer){
			select(GetLastError()) {
				case 5/*_ERROR_ACCESS_DENIED*/ {
					mainForm.static2.text="句柄没有 DELETE 访问权限。"	
				}
				case 6/*_ERROR_INVALID_HANDLE*/ {
					mainForm.static2.text="指定的句柄无效。"
				}
				case 0x430/*_ERROR_SERVICE_MARKED_FOR_DELETE*/ {
					mainForm.static2.text="指定的服务已被标记为要删除。"
				}				
			}
		}
		mainForm.static2.text="删除驱动服务安装成功"
		CloseServiceHandle(hServer)
	}
}

打开服务=function(name){
	var handle=OpenSCManager(null,null,0xF003F/*_SC_MANAGER_ALL_ACCESS*/)
	if handle == null{
 		//mainForm.static2.text=lasterr()
 		CloseServiceHandle(handle)
 		return -6; 
 	}
	var hServer = OpenService(handle,name, 0xF0003/*_SERVER_ALL_ACCESS*/);
 	if (hServer == NULL){
 		//mainForm.edit2.print(GetLastError()) 		
 		select(GetLastError()) {
 			case 0x424/*_ERROR_SERVICE_DOES_NOT_EXIST*/ {
 				mainForm.static2.text="指定的服务不存在。"
 				CloseServiceHandle(handle)
 				return -1 ; 
 			}
 			case 5/*_ERROR_ACCESS_DENIED*/ {
 				mainForm.static2.text="句柄无权访问服务。"
 				CloseServiceHandle(handle)
 				return -2;
 			}
 			case 6/*_ERROR_INVALID_HANDLE*/ {
 				mainForm.static2.text="指定的句柄无效。"
 				CloseServiceHandle(handle)
 				return -3;
 			}
 			case 0x7B/*_ERROR_INVALID_NAME*/ {
 				mainForm.static2.text="指定的服务名称无效。"
 				CloseServiceHandle(handle)
 				return -4;
 			} 			
 		}
 	}else{
 		CloseServiceHandle(handle)
 		return hServer; 
 	}	
}
控制服务=function(hServer,code){
	if code==null{
		return -1; 
	}
	/*控制代码 128~255 自定义代码
	1 通知服务应停止。 hService 句柄必须具有SERVICE_STOP访问权限。将停止请求发送到服务后,不应将其他控件发送到服务。
	2 通知服务应暂停。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。
	3 通知暂停的服务应恢复。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。
	4 通知服务应将其当前状态信息报告给服务控制管理器。 hService 句柄必须具有SERVICE_INTERROGATE访问权限。请注意,此控件通常不有用,因为 SCM 知道服务的当前状态。
	6 通知服务其启动参数已更改。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。
	7 通知网络服务有一个新组件用于绑定。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	8 通知网络服务已删除绑定组件。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	9 通知网络服务已启用禁用的绑定。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	a 通知网络服务已禁用其中一个绑定。 hService 句柄必须具有SERVICE_PAUSE_CONTINUE访问权限。 但是,此控制代码已被弃用;请改用即插即用功能。
	*/
	var ptr=SERVICE_STATUS()//创建一个结构体对象
		
	//ptr=topointer(ptr)
	//prt=raw.convert(ptr,)
	//ptr=raw.realloc(60)
	mainForm.edit2.print(type(ptr))	
	hServer=打开服务("TitanHide")
	
	mainForm.edit2.dump(hServer)
	if type(hServer)=="pointer"{	
		if !ControlService(hServer,1/*_SERVICE_CONTROL_STOP*/,ptr){
			select(GetLastError()) {
				case 0x426/*_ERROR_SERVICE_NOT_ACTIVE*/ {
					mainForm.static2.text="该服务尚未启动。"
 					return -1;
				}
				case 0x41B/*_ERROR_DEPENDENT_SERVICES_RUNNING*/ {
					mainForm.static2.text="无法停止该服务,因为其他正在运行的服务依赖于它。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 5/*_ERROR_ACCESS_DENIED*/ {
					mainForm.static2.text="句柄没有所需的访问权限"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x57/*_ERROR_INVALID_PARAMETER*/ {
					mainForm.static2.text="请求的控制代码未定义。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x41D/*_ERROR_SERVICE_REQUEST_TIMEOUT*/{
					mainForm.static2.text="服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能会在控制处理程序函数中被阻止。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x45B/*_ERROR_SHUTDOWN_IN_PROGRESS*/ {
					mainForm.static2.text="系统正在关闭。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 6/*_ERROR_INVALID_HANDLE*/ {
					mainForm.static2.text="指定的句柄未使用 CreateService 或 OpenService 获取,或者句柄不再有效。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x425/*_ERROR_SERVICE_CANNOT_ACCEPT_CTRL*/ {
					mainForm.static2.text="由于服务的状态 为SERVICE_STOPPED、 SERVICE_START_PENDING或 SERVICE_STOP_PENDING,因此无法将请求的控制代码发送到服务。"
 					CloseServiceHandle(hServer)
 					return -1;
				}
				case 0x41C/*_ERROR_INVALID_SERVICE_CONTROL*/ {
					mainForm.static2.text="请求的控制代码无效或服务无法接受该控制代码"
					CloseServiceHandle(hServer)
 					return -1;
				}
			}		
		}
	}	
}



mainForm.button.oncommand = function(id,event){
	安装()
}

mainForm.button2.oncommand = function(id,event){
	hServer=打开服务("TitanHide")
	启动(hServer)
}

mainForm.edit.oncommand = function(id,event){
	if path==null{
		path=fsys.dlg.open("*.sys","选择驱动文件","c:\")	
		mainForm.edit.text=path
	}	
	return ; 
}

mainForm.button4.oncommand = function(id,event){	
	ret=卸载(hServer)
	mainForm.edit2.print(ret)
}
mainForm.onDropFiles = function(files){
	//mainForm.edit2.print(files[1])
	mainForm.edit.text=files[1]
}

mainForm.button3.oncommand = function(id,event){
	控制服务("TitanHide",1)
}
mainForm.show();
return win.loopMessage();

/**
loaddriver=function(path){
	
	//hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);	
	OpenSCManager=::Advapi32.api("OpenSCManagerW","ptr(
						ustring lpMachineName,
						ustring lpDatabaseName,
						INT dwDesiredAccess
	)")
	CreateService=::Advapi32.api("CreateServiceW","ptr(
				ptr hSCManager, 
				ustring lpServiceName, 
				ustring lpDisplayName, 
				INT dwDesiredAccess, 
				INT dwServiceType,
				INT dwStartType, 
				INT dwErrorControl,
				ustring lpBinaryPathName, 
				ustring lpLoadOrderGroup,
				ustring lpdwTagId, 
				ustring lpDependencies,
				ustring lpServiceStartName, 
				ustring lpPassword
				)");						
	
	StartService=::Advapi32.api("StartServiceW","int(
 						ptr hService,
 						INT dwNumServiceArgs,
 						string lpServiceArgVectors
				)"); 
	OpenService =::Advapi32.api("OpenServiceW","ptr(
 						ptr hSCManager,
 						ustring lpServiceName,
 						INT dwDesiredAccess
				)"); 			
	CloseServiceHandle=::Advapi32.api("CloseServiceHandle","int(
						 ptr hSCObject
				)");

	ControlService=::Advapi32.api("ControlService","int(
 						ptr hService,
 						INT dwControl,
 						pointer lpServiceStatus
				)"); 
	DeleteService=::Advapi32.api("DeleteService","int(
						 ptr hSCObject
				)");
	
		

 	/*
 	dwServiceType 服务类型有
 		SERVICE_ADAPTER
		0x00000004
		保留。
		SERVICE_FILE_SYSTEM_DRIVER
		0x00000002
		文件系统驱动程序服务。
		SERVICE_KERNEL_DRIVER
		0x00000001
		驱动程序服务。
		SERVICE_RECOGNIZER_DRIVER
		0x00000008
		保留。
		SERVICE_WIN32_OWN_PROCESS
		0x00000010
		在其自己的进程中运行的服务。
		SERVICE_WIN32_SHARE_PROCESS
		0x00000020
		与一个或多个其他服务共享进程的服务	
 	
 	dwStartType参数有
 		SERVICE_AUTO_START
		0x00000002
		在系统启动期间服务控制管理器自动启动的服务。 有关详细信息,请参阅 “自动启动服务”。
		SERVICE_BOOT_START
		0x00000000
		系统加载程序启动的设备驱动程序。 此值只对驱动程序服务有效。
		SERVICE_DEMAND_START
		0x00000003
		进程调用 StartService 函数时由服务控制管理器启动的服务。 有关详细信息,请参阅 “按需启动服务”。
		SERVICE_DISABLED
		0x00000004
		无法启动的服务。 尝试启动服务会导致错误代码 ERROR_SERVICE_DISABLED。
		SERVICE_SYSTEM_START
		0x00000001
		IoInitSystem 函数启动的设备驱动程序。 此值只对驱动程序服务有效。	
 	
 	dwErrorControl 参数有
 		SERVICE_ERROR_CRITICAL
		0x00000003
		如果可能,启动程序会在事件日志中记录错误。 如果启动最后一个已知良好的配置,启动操作将失败。 否则,系统会使用上次已知的良好配置重启系统。
		SERVICE_ERROR_IGNORE
		0x00000000
		启动程序将忽略错误并继续启动操作。
		SERVICE_ERROR_NORMAL
		0x00000001
		启动程序在事件日志中记录错误,但会继续启动操作。
		SERVICE_ERROR_SEVERE
		0x00000002
		启动程序在事件日志中记录错误。 如果启动最后一个已知良好的配置,启动操作将继续。 否则,系统会使用最后一个已知良好的配置重启系统。
 	*/
 	
 	handle=OpenSCManager(null,null,0xF003F/*_SC_MANAGER_ALL_ACCESS*/)
 	if handle == null{
 		winform.editChange.print(lasterr())
 		return ; 
 	}
 	//winform.editChange.print(handle)
 	
 	hServer=CreateService(handle,
 			"TitanHide",
 			"TitanHide",
 			0xF01FF/*_SERVICE_ALL_ACCESS*/,
 			0x1/*_SERVICE_KERNEL_DRIVER*/,
 			0x3/*_SERVICE_DEMAND_START*/,
 			0x0/*_SERVICE_ERROR_IGNORE*/,
 			"I:\work\ring0\titanhide.sys",
 			null,
 			null,
 			null,
 			null,
 			null
 	)
 	//winform.editChange.print(hServer)
 	if hServer == null { 		
 		select(GetLastError()) {
 			case 5 {
 				winform.editChange.print("拒绝访问")
 				CloseServiceHandle(handle)
 				return -1; 
 			}
 			case 0x431/*_ERROR_SERVICE_EXISTS*/ {
 				hService = OpenService(handle,"TitanHide", 0xF0003/*_SERVER_ALL_ACCESS*/);
 				if (hService == NULL){
					return -1;
				}
 			}
 			else{
 				mainForm.static2.text="错误"
 				CloseServiceHandle(handle)
 				return -2; 
 			} 			
 		} 		
 	}
 	
 	
 	if !StartService(hServer,0,null){
 		mainForm.static2.text="启动驱动失败"
 		CloseServiceHandle(hServer)
 		CloseServiceHandle(handle)
 		return -3; 
 	}
 	
 	class SERVICE_STATUS {
 		INT dwServiceType;
 		INT dwCurrentState;
 		INT dwControlsAccepted;
 		INT dwWin32ExitCode;
 		INT dwServiceSpecificExitCode;
 		INT dwCheckPoint;
 		INT dwWaitHint;
 	}
 	status=raw.struct(SERVICE_STATUS)
 	ControlService(hServer,1/*_SERVICE_CONTROL_STOP*/,status)
 			
}
**/


最新回复 (1)
  • netfox 13天前
    0 2
    好东西,学习了
返回
发新帖