⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioctldecoder.bat

📁 用汇编语言编写Windows驱动程序的工具
💻 BAT
📖 第 1 页 / 共 2 页
字号:
;@echo off
;goto make

echo
	echo -----------------
IFDEF DEBUG
	echo | DEBUG Build   |
ELSE
	echo | RELEASE Build |
ENDIF
	echo -----------------
echo

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
;  Written by Four-F (four-f@mail.ru)
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.386
.model flat, stdcall
option casemap:none

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                  I N C L U D E   F I L E S                                        
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\comctl32.inc
include \masm32\include\gdi32.inc
include \masm32\include\advapi32.inc
include \masm32\include\msimg32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\msimg32.lib

include \masm32\Macros\Strings.mac
include memory.asm
include MaskedEdit.asm
include htodw.asm


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                 S T R U C T U R E S                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DIMENSION STRUCT
	Pos	POINT	<>
	Siz	_SIZE	<>
DIMENSION ENDS

MNEMONIC STRUCT
	ioctl	DWORD	?
	lpstr	LPSTR	?
MNEMONIC ENDS

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                         F U N C T I O N S   P R O T O T Y P E S                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DlgProc	proto :HWND, :UINT, :WPARAM, :LPARAM

externdef g_aszMnemonics:PTR MNEMONIC
externdef g_cbaMnemonics:DWORD

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                        M A C R O S                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

$invoke MACRO vars:VARARG
     invoke vars
     EXITM <eax>
ENDM

mrm MACRO Des:REQ, Sor:REQ
	mov eax, Sor
	mov Des, eax
ENDM

$LOWORD MACRO dwVar:REQ
	IFDIFI <dwVar>, <eax>	;; don't move eax onto itself
		mov eax, dwVar
	ENDIF
	and eax, 0FFFFh
	EXITM <eax>
ENDM

$HIWORD MACRO dwVar:REQ
	IFDIFI <dwVar>, <eax>	;; don't move eax onto itself
		mov eax, dwVar
	ENDIF
	shr eax, 16
	EXITM <eax>
ENDM

date MACRO
local pos, month

	;; Day
	pos = 1
	% FORC chr, @Date
		IF (pos EQ 4) OR (pos EQ 5)
			db "&chr"
		ENDIF
		pos = pos + 1
	ENDM

	;; Month
	pos = 1
	% FORC chr, @Date
		IF (pos EQ 1)
			month TEXTEQU @SubStr(%@Date, 1 , 2)
			IF month EQ 01
				db " Jan "	
			ELSEIF month EQ 02
				db " Feb "	
			ELSEIF month EQ 03
				db " Mar "	
			ELSEIF month EQ 04
				db " Apr "	
			ELSEIF month EQ 05
				db " May "	
			ELSEIF month EQ 06
				db " Jun "	
			ELSEIF month EQ 07
				db " Jul "	
			ELSEIF month EQ 08
				db " Aug "	
			ELSEIF month EQ 09
				db " Sep "	
			ELSEIF month EQ 10
				db " Oct "	
			ELSEIF month EQ 11
				db " Nov "	
			ELSEIF month EQ 12
				db " Dec "	
			ENDIF
		ENDIF
		pos = pos + 1
	ENDM

	;; Year
	db "20"
	pos = 1
	% FORC chr, @Date
		IF (pos EQ 7) OR (pos EQ 8)
			db "&chr"
		ENDIF
		pos = pos + 1
	ENDM

ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                      E Q U A T E S                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

IDD_MAIN		equ	1000

IDE_IOCTL		equ 1001
IDE_MNEMONIC	equ 1002
IDE_DEVICE		equ 1003
IDE_FUNCTION	equ 1004
IDE_METHOD		equ 1005
IDE_ACCESS		equ 1006
IDE_BITS		equ 1007

IDC_RECOGNIZES_XXX_MNEMONICS equ 1008

IDM_ABOUT		equ 2000

IDI_ICON		equ 3000
IDI_BMP			equ 3001

xBmp			= 77				; X of bitmap
yBmp			= 235

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                  R E A D O N L Y  D A T A                                         
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.const

CTA0 "%d", g_szDec
CTA0 "0x%X", g_szHex
CTA0 "0x%08X", g_szHex08

szAbout						db "About...", 0
szWrittenBy					db "I/O Control Code Decoder v1.2", 0Ah, 0Dh
							db "Compiled on "
							date
							db 0Ah, 0Dh, 0Ah, 0Dh
							db "Written by Four-F <four-f@mail.ru>", 0

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                              I N I T I A L I Z E D  D A T A                                       
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

POINTERS SEGMENT READONLY PUBLIC USE32 'CONST'

g_aszDeviceTypes	label LPSTR
LPSTR	$CTA0("0")
LPSTR	$CTA0("FILE_DEVICE_BEEP")					; 01
LPSTR	$CTA0("FILE_DEVICE_CD_ROM")					; 02
LPSTR	$CTA0("FILE_DEVICE_CD_ROM_FILE_SYSTEM")		; 03
LPSTR	$CTA0("FILE_DEVICE_CONTROLLER ")			; 04
LPSTR	$CTA0("FILE_DEVICE_DATALINK ")				; 05
LPSTR	$CTA0("FILE_DEVICE_DFS")					; 06
LPSTR	$CTA0("FILE_DEVICE_DISK")					; 07
LPSTR	$CTA0("FILE_DEVICE_DISK_FILE_SYSTEM")		; 08
LPSTR	$CTA0("FILE_DEVICE_FILE_SYSTEM")			; 09
LPSTR	$CTA0("FILE_DEVICE_INPORT_PORT")			; 0A
LPSTR	$CTA0("FILE_DEVICE_KEYBOARD")				; 0B
LPSTR	$CTA0("FILE_DEVICE_MAILSLOT ")				; 0C
LPSTR	$CTA0("FILE_DEVICE_MIDI_IN")				; 0D
LPSTR	$CTA0("FILE_DEVICE_MIDI_OUT")				; 0E
LPSTR	$CTA0("FILE_DEVICE_MOUSE")					; 0F
LPSTR	$CTA0("FILE_DEVICE_MULTI_UNC_PROVIDER")		; 10
LPSTR	$CTA0("FILE_DEVICE_NAMED_PIPE")				; 11
LPSTR	$CTA0("FILE_DEVICE_NETWORK")				; 12
LPSTR	$CTA0("FILE_DEVICE_NETWORK_BROWSER")		; 13
LPSTR	$CTA0("FILE_DEVICE_NETWORK_FILE_SYSTEM")	; 14
LPSTR	$CTA0("FILE_DEVICE_NULL")					; 15
LPSTR	$CTA0("FILE_DEVICE_PARALLEL_PORT")			; 16
LPSTR	$CTA0("FILE_DEVICE_PHYSICAL_NETCARD")		; 17
LPSTR	$CTA0("FILE_DEVICE_PRINTER")				; 18
LPSTR	$CTA0("FILE_DEVICE_SCANNER")				; 19
LPSTR	$CTA0("FILE_DEVICE_SERIAL_MOUSE_PORT")		; 1A
LPSTR	$CTA0("FILE_DEVICE_SERIAL_PORT")			; 1B
LPSTR	$CTA0("FILE_DEVICE_SCREEN")					; 1C
LPSTR	$CTA0("FILE_DEVICE_SOUND")					; 1D
LPSTR	$CTA0("FILE_DEVICE_STREAMS")				; 1E
LPSTR	$CTA0("FILE_DEVICE_TAPE")					; 1F
LPSTR	$CTA0("FILE_DEVICE_TAPE_FILE_SYSTEM")		; 20
LPSTR	$CTA0("FILE_DEVICE_TRANSPORT")				; 21
LPSTR	$CTA0("FILE_DEVICE_UNKNOWN")				; 22
LPSTR	$CTA0("FILE_DEVICE_VIDEO ")					; 23
LPSTR	$CTA0("FILE_DEVICE_VIRTUAL_DISK")			; 24
LPSTR	$CTA0("FILE_DEVICE_WAVE_IN")				; 25
LPSTR	$CTA0("FILE_DEVICE_WAVE_OUT")				; 26
LPSTR	$CTA0("FILE_DEVICE_8042_PORT")				; 27
LPSTR	$CTA0("FILE_DEVICE_NETWORK_REDIRECTOR")		; 28
LPSTR	$CTA0("FILE_DEVICE_BATTERY")				; 29
LPSTR	$CTA0("FILE_DEVICE_BUS_EXTENDER")			; 2A FILE_DEVICE_GAMEENUM
LPSTR	$CTA0("FILE_DEVICE_MODEM")					; 2B
LPSTR	$CTA0("FILE_DEVICE_VDM")					; 2C
LPSTR	$CTA0("FILE_DEVICE_MASS_STORAGE")			; 2D
LPSTR	$CTA0("FILE_DEVICE_SMB")					; 2E
LPSTR	$CTA0("FILE_DEVICE_KS")						; 2F
LPSTR	$CTA0("FILE_DEVICE_CHANGER")				; 30
LPSTR	$CTA0("FILE_DEVICE_SMARTCARD")				; 31
LPSTR	$CTA0("FILE_DEVICE_ACPI")					; 32
LPSTR	$CTA0("FILE_DEVICE_DVD")					; 33
LPSTR	$CTA0("FILE_DEVICE_FULLSCREEN_VIDEO")		; 34
LPSTR	$CTA0("FILE_DEVICE_DFS_FILE_SYSTEM")		; 35
LPSTR	$CTA0("FILE_DEVICE_DFS_VOLUME")				; 36
LPSTR	$CTA0("FILE_DEVICE_SERENUM")				; 37
LPSTR	$CTA0("FILE_DEVICE_TERMSRV")				; 38
LPSTR	$CTA0("FILE_DEVICE_KSEC")					; 39
g_cbaDeviceTypes	equ $-g_aszDeviceTypes

g_aszMethods	label LPSTR
LPSTR	$CTA0("METHOD_BUFFERED")					; 0
LPSTR	$CTA0("METHOD_IN_DIRECT")					; 1
LPSTR	$CTA0("METHOD_OUT_DIRECT")					; 2
LPSTR	$CTA0("METHOD_NEITHER")						; 3
g_cbaMethods	equ $-g_aszMethods

g_aszAccesses	label LPSTR
LPSTR	$CTA0("FILE_ANY_ACCESS")					; 0
LPSTR	$CTA0("FILE_READ_ACCESS")					; 1
LPSTR	$CTA0("FILE_WRITE_ACCESS")					; 2
LPSTR	$CTA0("FILE_READ_ACCESS + FILE_WRITE_ACCESS"); 3
g_cbaAccesses	equ $-g_aszAccesses

POINTERS ENDS

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                              I N I T I A L I Z E D  D A T A                                       
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.data

g_BmpDimension			DIMENSION	<{xBmp, yBmp},{ , }>

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                              U N I N I T I A L I Z E D  D A T A                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.data?

g_hInstance				HINSTANCE	?

g_hDlg					HWND		?

g_hwndEditIoctl			HWND		?
g_hwndSpinFunction		HWND		?
g_hwndSpinMethod		HWND		?
g_hwndSpinAccess		HWND		?

g_hwndStaticMnemonics	HWND		?
g_hwndEditMnemonic		HWND		?

g_hFontOld1				HFONT		?
g_hFontBold				HFONT		?

g_hFontOld2				HFONT		?
g_hFontCourier			HFONT		?

g_hbmp					HBITMAP		?
g_hMemDC				HDC			?

;g_hwndBits				HWND		?

IFDEF DEBUG
g_hConsoleInput			HANDLE		?
g_hConsoleOutput		HANDLE		?
ENDIF

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       C O D E                                                     
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.code

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   DrawTransparent                                                 
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DrawTransparent proc uses esi hDC:HDC, hMemDC:HDC, hbmp:HBITMAP, pBmpDimension:LPVOID

local hbmpOld:HBITMAP

	mov hbmpOld, $invoke(SelectObject, hMemDC, hbmp)

	mov esi, pBmpDimension
	assume esi:ptr DIMENSION	
	; Get ROLORREF of left-top most pixel to use it as transparent
	invoke GetPixel, hMemDC, 0, 0
	push eax						; crTransparent
	push [esi].Siz.y				; nHeightSrc
	push [esi].Siz.x				; nWidthSrc
	push 0							; nYOriginSrc
	push 0							; nXOriginSrc
	push hMemDC						; hdcSrc
	push [esi].Siz.y				; hHeightDest
	push [esi].Siz.x				; nWidthDest
	push [esi].Pos.y				; nYOriginDest
	push [esi].Pos.x				; nXOriginDest
	push hDC						; hdcDest
	call TransparentBlt
	assume esi:nothing

	invoke SelectObject, hMemDC, hbmpOld

	ret

DrawTransparent endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                    DwToBinStr                                                     
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DwToBinStr proc uses esi dwVal:DWORD, pBuffer:LPVOID, uBits:UINT

	mov esi, pBuffer
	.if esi != NULL

		mov edx, dwVal
		mov ecx, uBits
		and byte ptr [esi][ecx], 0			; terminate string with zero
		.repeat
			shr edx, 1
			.if CARRY?
				mov byte ptr [esi][ecx-1], '1'
			.else
				mov byte ptr [esi][ecx-1], '0'
			.endif
		.untilcxz
	.endif

	ret

DwToBinStr endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       ClearText                                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

ClearText proc uses ebx uExclude:UINT

	mov ebx, 10
	.while ebx
		xor eax, eax
		push eax
		lea eax, [ebx + IDE_IOCTL]
		.if eax != uExclude
			invoke SetDlgItemText, g_hDlg, eax, esp
		.endif
		pop eax
		dec ebx
	.endw

	ret

ClearText endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       Refresh                                                     
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
			
Refresh proc uses ebx esi edi uActiveControl:UINT

local buffer[512]:CHAR

.if uActiveControl == IDE_IOCTL

	invoke GetWindowText, g_hwndEditIoctl, addr buffer, sizeof buffer

	invoke htodw, addr buffer
	mov ebx, eax

	; Try to recognize mnemonic from value

	.if ebx != 0
		mov ecx, g_cbaMnemonics
		shr ecx, 3						; / sizeof MNEMONIC
		; ecx = number of entries in g_aszMnemonics array
		mov eax, $CTA0("")				; If mnemonic not found clear
		lea edx, g_aszMnemonics
		assume edx:ptr MNEMONIC
		.while ecx
			dec ecx			; zerobased index
			.if ebx == [edx].ioctl[ecx * sizeof MNEMONIC]
				mov eax, [edx].lpstr[ecx * sizeof MNEMONIC]
				;invoke lstrcpy, addr buffer, eax
				;lea eax, buffer
				and byte ptr [eax], 11011111y	; Lower Case to Upper Case
				.break
			.endif
		.endw
		assume edx:nothing

		invoke SetDlgItemText, g_hDlg, IDE_MNEMONIC, eax
	.endif

.elseif IDE_MNEMONIC

	; Try to recognize value from mnemonic

	xor ebx, ebx

	invoke GetDlgItemText, g_hDlg, IDE_MNEMONIC, addr buffer, sizeof buffer
	.if eax != 0

		mov esi, g_cbaMnemonics
		shr esi, 3						; / sizeof MNEMONIC
		; esi = number of entries in g_aszMnemonics array
		lea edi, g_aszMnemonics
		assume edi:ptr MNEMONIC
		.while esi
			dec esi			; zerobased index
			invoke lstrcmpi, addr buffer, [edi].lpstr[esi * sizeof MNEMONIC]
			.if eax == 0
				mov ebx, [edi].ioctl[esi * sizeof MNEMONIC]
				; Match found
				invoke wsprintf, addr buffer, $CTA0("%08X"), [edi].ioctl[esi * sizeof MNEMONIC]
				invoke SetWindowText, g_hwndEditIoctl, addr buffer
				.break
			.endif
		.endw
		assume edi:nothing

	.endif

.endif

.if ebx != 0

	; Device Type

	mov eax, ebx
	and eax, 0ffff0000h
	shr eax, 16
	mov ecx, g_cbaDeviceTypes
	shr ecx, 2						; / sizeof LPSTR
	.if eax < ecx
		mov eax, g_aszDeviceTypes[eax * sizeof LPSTR]
	.else

		.if eax == 'm'	
			mov ecx, $CTA0("MOUNTMGRCONTROLTYPE")
		.elseif eax == 'M'
			mov ecx, $CTA0("MOUNTDEVCONTROLTYPE")
		.elseif eax == 'g'
			mov ecx, $CTA0("FTCONTROLTYPE")
		.elseif eax == 'V'
			mov ecx, $CTA0("IOCTL_VOLUME_BASE")
		.elseif eax == 'A'
			mov ecx, $CTA0("FILE_DEVICE_SERVER_AVAILABILITY")
		.elseif eax == 'S'
			mov ecx, $CTA0("VOLSNAPCONTROLTYPE")
		.elseif eax == 'f'
			mov ecx, $CTA0("FTTYPE")
		.else
			xor ecx, ecx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -