最近进展很慢 因为驱动是一个未曾涉及也未曾想过涉及的领域 加上win32驱动资料有限 所以学的稍微有点慢 还有单位制作平衡计分卡这类的企业文化方面的要求 搞得烦烦的 也算是心境方面的原因 还好 昨晚静了静心 突破了一点 :当时不太理解为什么自己写的驱动无法卸载 现在明白了 要在入口函数处定义卸载子程序的入口地址 因为以前以为卸载由系统完成 没必要自己专门写个卸载子程序 其实不是这样的 哪怕你卸载子程序里什么都没有 也要写上 只要调用了卸载子程序 就基本成功地卸掉了由startservice函数开启的驱动
控制台程序:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include advapi32.inc
includelib advapi32.lib
.data?
hInstance dd ?
hInstance3 dd ? ;“安装”控件句柄
hInstance4 dd ? ;显示安装是否成功标签
hInstance5 dd ? ;“卸载”控件句柄
hInstance6 dd ? ;显示卸载是否成功标签
hInstance7 dd ? ;“启动”控件句柄
hInstance8 dd ? ;显示启动是否成功标签
hInstance9 dd ? ;“停止”控件句柄
hInstance10 dd ? ;显示停止是否成功标签
hWinMain dd ?
;SymbolicLinkName UNICODE_STRING <>
hSCManager dd ?
hService dd ?
acDriverPath db 250 dup (?)
hDevice dd ?
dwInBuffer dd ?
dwOutBuffer dd ?
dwBytesReturned dd ?
.data
szsysname db '1.sys',0
szfuwuname db '1',0
szdisplayname db '11',0
sz db '/??/d:/我的文档/桌面',0
szSymbolicLinkName db '/','/','/','/','.','/','/','1',0
;.const
szClassName db 'MyClass',0
szCaptionMain db '驱动安装卸载软件',0
szButton db 'button',0
szbiaoqian db 'static',0
szText3 db '安装',0
szText4 db '安装成功',0
szText5 db '卸载',0
szText6 db '卸载成功',0
szErr db '操作失败',0
DLG_MAIN equ 1
IDINSTALL equ 3
IDSHOW3 equ 4
IDUNISTALL equ 5
IDSHOW5 equ 6
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
local _ss:SERVICE_STATUS
mov eax,uMsg
;********************************************************************
;********************************************************************
; 建立控件
;********************************************************************
.if eax == WM_CREATE
invoke CreateWindowEx,NULL,/ ;"安装"控件
offset szButton,offset szText3,/
WS_CHILD or WS_VISIBLE,/
10,10,50,20,/
hWnd,3,hInstance3,NULL
invoke CreateWindowEx,NULL,/ ;显示安装是否成功标签
offset szbiaoqian,NULL,/
WS_CHILD or WS_VISIBLE,/
70,10,200,20,/
hWnd,4,hInstance4,NULL
invoke CreateWindowEx,NULL,/ ;"卸载"控件
offset szButton,offset szText5,/
WS_CHILD or WS_VISIBLE,/
10,40,50,20,/
hWnd,5,hInstance5,NULL
invoke CreateWindowEx,NULL,/ ;显示卸载是否成功标签
offset szbiaoqian,NULL,/
WS_CHILD or WS_VISIBLE,/
70,40,200,20,/
hWnd,6,hInstance6,NULL
;********************************************************************
;按下这个按钮
;********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDINSTALL
invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
.if eax
mov hSCManager,eax
push eax
invoke GetFullPathName,addr szsysname,sizeof acDriverPath,addr acDriverPath,esp
pop eax
invoke CreateService,hSCManager,addr szfuwuname,addr szdisplayname,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,addr acDriverPath,NULL,NULL,NULL,NULL,NULL
.if eax
mov hService, eax
invoke SetDlgItemText,hWnd,4,addr szText4
.else
invoke SetDlgItemText,hWnd,4,addr szErr
.endif
;invoke OpenService,hSCManager,addr szsysname,SERVICE_ALL_ACCESS
invoke StartService,hService,NULL,NULL
.endif
.elseif ax == IDUNISTALL
invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
mov hSCManager,eax
invoke OpenService,hSCManager,addr szfuwuname,SERVICE_ALL_ACCESS
mov hService,eax
invoke ControlService,hService,SERVICE_CONTROL_STOP,addr _ss
.if eax
invoke SetDlgItemText,hWnd,6,addr szText6
.else
invoke SetDlgItemText,hWnd,6,addr szErr
.endif
invoke DeleteService,hService
invoke CloseServiceHandle,hService
invoke CloseServiceHandle,hSCManager
.endif
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;********************************************************************
; 注册窗口类
;********************************************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,/
WS_OVERLAPPEDWINDOW,/
830,50,400,200,/
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
**************************************************
**************************************************
**************************************************
驱动程序:
.386
.model flat, stdcall
option casemap:none
include w2k/ntstatus.inc
include w2k/ntddk.inc
include w2k/ntoskrnl.inc
include w2k/w2kundoc.inc
includelib ntoskrnl.lib
..code
DriverUnload proc pDriverObject:PDRIVER_OBJECT
pushad
popad
ret
DriverUnload endp
.code INIT
DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING
local status:NTSTATUS
local pDeviceObject:PVOID
mov eax, pDriverObject
assume eax:PTR DRIVER_OBJECT
mov [eax].DriverUnload,offset DriverUnload
assume eax:nothing
mov status, STATUS_SUCCESS
mov eax,STATUS_SUCCESS
ret
DriverEntry endp
end DriverEntry