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

📄 enumdisk.bat

📁 KmdKit 汇编下开发驱动的工具 由俄罗斯某强男开发
💻 BAT
📖 第 1 页 / 共 2 页
字号:
;@echo off
;goto make

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
;  EnumDisk - Enumerates all available disk devices and gets the device property.
;
;  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\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\w2k\ntdll.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

include \masm32\include\w2k\ntddk.inc
include \masm32\include\w2k\ntddstor.inc
include \masm32\include\w2k\guiddef.inc

includelib setupapi.lib

include \masm32\Macros\Strings.mac

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                    P R O T O T Y P E S                                            
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

wsprintfW proto C :DWORD, :VARARG
pwsprintfW typedef proto C :DWORD, :VARARG
					
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       E Q U A T E S                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

; windows.inc can't be included because of ntddk.inc

OPEN_EXISTING			equ 3
MB_OK					equ 0h
MB_ICONHAND				equ 10h
MB_ICONERROR			equ MB_ICONHAND
MB_ICONSTOP				equ MB_ICONHAND
MB_ICONINFORMATION		equ 40h
INVALID_HANDLE_VALUE	equ -1

COORD STRUCT
  x  WORD      ?
  y  WORD      ?
COORD ENDS

SMALL_RECT STRUCT
  Left      WORD      ?
  Top       WORD      ?
  Right     WORD      ?
  Bottom    WORD      ?
SMALL_RECT ENDS

CONSOLE_SCREEN_BUFFER_INFO STRUCT
  dwSize                COORD <>
  dwCursorPosition      COORD <>
  wAttributes           WORD      ?
  srWindow              SMALL_RECT <>
  dwMaximumWindowSize   COORD <>
CONSOLE_SCREEN_BUFFER_INFO ENDS

STD_INPUT_HANDLE                     equ -10
STD_OUTPUT_HANDLE                    equ -11
STD_ERROR_HANDLE                     equ -12

FOREGROUND_BLUE                      equ 1h
FOREGROUND_GREEN                     equ 2h
FOREGROUND_RED                       equ 4h
FOREGROUND_INTENSITY                 equ 8h

ERROR_INVALID_DATA                   equ 13
ERROR_INSUFFICIENT_BUFFER            equ 122
ERROR_NO_MORE_ITEMS                  equ 259

; Definitiond from \setupapi.h

HDEVINFO	typedef	DWORD

SP_DEVINFO_DATA STRUCT
	cbSize		DWORD	?
	ClassGuid	GUID	<>
	DevInst		DWORD	?	; DEVINST handle
	Reserved	DWORD	?	; ULONG_PTR
SP_DEVINFO_DATA ENDS
PSP_DEVINFO_DATA typedef ptr SP_DEVINFO_DATA

SP_DEVICE_INTERFACE_DATA STRUCT
	cbSize				DWORD	?
	InterfaceClassGuid	GUID	<>
	Flags				DWORD	?
	Reserved			DWORD	?	; ULONG_PTR
SP_DEVICE_INTERFACE_DATA ENDS
PSP_DEVICE_INTERFACE_DATA typedef ptr SP_DEVICE_INTERFACE_DATA

SP_DEVICE_INTERFACE_DETAIL_DATA_A  STRUCT	; sizeof = 5
	cbSize		DWORD	?
	DevicePath	db 1 dup(?)		; CHAR [ANYSIZE_ARRAY]
SP_DEVICE_INTERFACE_DETAIL_DATA_A ENDS
PSP_DEVICE_INTERFACE_DETAIL_DATA_A typedef ptr SP_DEVICE_INTERFACE_DETAIL_DATA_A

SP_DEVICE_INTERFACE_DETAIL_DATA_W  STRUCT	; sizeof = 5
	cbSize		DWORD	?
	DevicePath	WORD 1 dup(?)	; WCHAR [ANYSIZE_ARRAY]
SP_DEVICE_INTERFACE_DETAIL_DATA_W ENDS
PSP_DEVICE_INTERFACE_DETAIL_DATA_W typedef ptr SP_DEVICE_INTERFACE_DETAIL_DATA_W
	
IFDEF UNICODE
	SP_DEVICE_INTERFACE_DETAIL_DATA		equ <SP_DEVICE_INTERFACE_DETAIL_DATA_W>
	PSP_DEVICE_INTERFACE_DETAIL_DATA	equ	<PSP_DEVICE_INTERFACE_DETAIL_DATA_W>
ELSE
	SP_DEVICE_INTERFACE_DETAIL_DATA		equ <SP_DEVICE_INTERFACE_DETAIL_DATA_A>
	PSP_DEVICE_INTERFACE_DETAIL_DATA	equ	<PSP_DEVICE_INTERFACE_DETAIL_DATA_A>
ENDIF

SPDRP_HARDWAREID		equ 00000001h	; HardwareID (R/W)

DIGCF_DEFAULT           equ 00000001  ; only valid with DIGCF_DEVICEINTERFACE
DIGCF_PRESENT           equ 00000002
DIGCF_ALLCLASSES        equ 00000004
DIGCF_PROFILE           equ 00000008
DIGCF_DEVICEINTERFACE   equ 00000010h

SetupDiDestroyDeviceInfoList proto :DWORD
SetupDiEnumDeviceInfo proto :DWORD,:DWORD,:DWORD
SetupDiEnumDeviceInterfaces proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

SetupDiGetDeviceRegistryPropertyA proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
SetupDiGetDeviceRegistryPropertyW proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
IFDEF UNICODE
	SetupDiGetDeviceRegistryProperty equ <SetupDiGetDeviceRegistryPropertyW>
ELSE
	SetupDiGetDeviceRegistryProperty equ <SetupDiGetDeviceRegistryPropertyA>
ENDIF

SetupDiGetDeviceInterfaceDetailA proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
SetupDiGetDeviceInterfaceDetailW proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
IFDEF UNICODE
	SetupDiGetDeviceInterfaceDetail equ <SetupDiGetDeviceInterfaceDetailW>
ELSE
	SetupDiGetDeviceInterfaceDetail	equ <SetupDiGetDeviceInterfaceDetailA>
ENDIF

SetupDiGetClassDevsA proto :DWORD,:DWORD,:DWORD,:DWORD
SetupDiGetClassDevsW proto :DWORD,:DWORD,:DWORD,:DWORD
IFDEF UNICODE
	SetupDiGetClassDevs equ <SetupDiGetClassDevsW>
ELSE
	SetupDiGetClassDevs equ <SetupDiGetClassDevsA>
ENDIF

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

POINTERS SEGMENT READONLY PUBLIC USE32 'CONST'

; Bus Type

g_apszBusType label LPSTR
LPSTR	$CTA0("UNKNOWN")
LPSTR	$CTA0("SCSI")
LPSTR	$CTA0("ATAPI")
LPSTR	$CTA0("ATA")
LPSTR	$CTA0("IEEE 1394")
LPSTR	$CTA0("SSA")
LPSTR	$CTA0("FIBRE")
LPSTR	$CTA0("USB")
LPSTR	$CTA0("RAID")
g_cbBusType	equ $-g_apszBusType

; SCSI Device Type

g_apszDeviceType label LPSTR
LPSTR	$CTA0("Direct Access Device")
LPSTR	$CTA0("Tape Device")
LPSTR	$CTA0("Printer Device")
LPSTR	$CTA0("Processor Device")
LPSTR	$CTA0("WORM Device")
LPSTR	$CTA0("CDROM Device")
LPSTR	$CTA0("Scanner Device")
LPSTR	$CTA0("Optical Disk")
LPSTR	$CTA0("Media Changer")
LPSTR	$CTA0("Comm. Device")
LPSTR	$CTA0("ASCIT8")
LPSTR	$CTA0("ASCIT8")
LPSTR	$CTA0("Array Device")
LPSTR	$CTA0("Enclosure Device")
LPSTR	$CTA0("RBC Device")
LPSTR	$CTA0("Unknown Device")
g_cbDeviceType	equ $-g_apszDeviceType

POINTERS ENDS

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

.data?
g_hConsoleInput		HANDLE ?
g_hConsoleOutput	HANDLE	?

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

.const

DEFINE_GUID GUID_DEVCLASS_DISKDRIVE, 04d36e967h, 0e325h, 011ceh, 0bfh, 0c1h, 008h, 000h, 02bh, 0e1h, 003h, 018h
;GUID_DEVCLASS_DISKDRIVE GUID {04d36e967h, 0e325h, 011ceh, {0bfh, 0c1h, 008h, 000h, 02bh, 0e1h, 003h, 018h}}

DEFINE_GUID GUID_DEVINTERFACE_DISK, 053f56307h, 0b6bfh, 011d0h, 094h, 0f2h, 000h, 0a0h, 0c9h, 01eh, 0fbh, 08bh
;GUID_DEVINTERFACE_DISK	GUID {053f56307h, 0b6bfh, 011d0h, {094h, 0f2h, 000h, 0a0h, 0c9h, 01eh, 0fbh, 08bh}}

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

.code

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                            malloc                                                 
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

malloc proc dwBytes:DWORD
; allocates dwBytes from current process's heap
; and returns pointer to allocated memory block.
; HeapAlloc(GetProcessHeap(), 0, dwBytes)

option PROLOGUE:NONE
option EPILOGUE:NONE

	invoke GetProcessHeap
	invoke HeapAlloc, eax, 0, [esp+4]
	ret (sizeof DWORD)

option PROLOGUE:PROLOGUEDEF
option EPILOGUE:EPILOGUEDEF

malloc endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                           free                                                    
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

free proc lpMem:PVOID
; frees memory block allocated from current process's heap
; HeapFree(GetProcessHead(), 0, lpMem)

option PROLOGUE:NONE
option EPILOGUE:NONE

	invoke GetProcessHeap
	invoke HeapFree, eax, 0, [esp+4]
	ret (sizeof PVOID)

option PROLOGUE:PROLOGUEDEF
option EPILOGUE:EPILOGUEDEF

free endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       PrintConsole                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

PrintConsole proc psz:LPSTR, dwAttributes:DWORD

local csbi:CONSOLE_SCREEN_BUFFER_INFO
local dwNumberOfBytesWritten:DWORD

	.if dwAttributes != 0
		invoke GetConsoleScreenBufferInfo, g_hConsoleOutput, addr csbi
		invoke SetConsoleTextAttribute, g_hConsoleOutput, dwAttributes
	.endif

	.if psz != NULL
		invoke lstrlen, psz
		.if eax
			mov ecx, eax
			invoke WriteFile, g_hConsoleOutput, psz, ecx, addr dwNumberOfBytesWritten, NULL
		.endif
	.endif

	.if dwAttributes != 0
		movzx eax, csbi.wAttributes
		invoke SetConsoleTextAttribute, g_hConsoleOutput, eax
	.endif

	ret

PrintConsole endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                    GetRegistryProperty                                            
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

GetRegistryProperty proc hDevInfo:HDEVINFO, dwIndex:DWORD

comment ^
Routine Description:
    This routine enumerates the disk devices using the Setup class interface
    GUID GUID_DEVCLASS_DISKDRIVE. Gets the Device ID from the Registry 
    property.

Arguments:
    hDevInfo	- Handles to the device information list
    dwIndex		- Device member 

Return Value:
	TRUE or FALSE. This decides whether to continue or not
^

local DevInfoData:SP_DEVINFO_DATA
local cb:DWORD
local dwDataType:DWORD
local pstr:LPSTR
local buffer[128]:CHAR

	mov DevInfoData.cbSize, sizeof SP_DEVINFO_DATA

	invoke SetupDiEnumDeviceInfo, hDevInfo, dwIndex, addr DevInfoData

	.if eax == FALSE

		invoke GetLastError

		.if eax == ERROR_NO_MORE_ITEMS
			invoke PrintConsole, $CTA0("No more devices.\n\n"), 0
		.else
			invoke wsprintf, addr buffer, $CTA0("SetupDiEnumDeviceInfo failed with error: %d\n"), eax
			invoke PrintConsole, addr buffer, 0
		.endif
		
		jmp ExitWithFalse
  
	.endif
        
	; We won't know the size of the HardwareID buffer until we call
	; this function. So call it with a null to begin with, and then 
	; use the required buffer size to Alloc the necessary space.
	; Keep calling we have success or an unknown failure.

	and cb, 0

	invoke SetupDiGetDeviceRegistryProperty, hDevInfo, addr DevInfoData, \
						SPDRP_HARDWAREID, addr dwDataType, pstr, cb, addr cb

	.if eax == FALSE

		invoke GetLastError

		.if eax != ERROR_INSUFFICIENT_BUFFER

			.if eax == ERROR_INVALID_DATA
 
				; May be a Legacy Device with no HardwareID. Continue.

				jmp ExitWithTrue

			.else
				invoke wsprintf, addr buffer, $CTA0("SetupDiGetDeviceInterfaceDetail failed with error: %d\n"), eax
				invoke PrintConsole, addr buffer, 0

				jmp ExitWithFalse
			.endif
		.endif
	.endif

	; We need to change the buffer size.

	invoke malloc, cb
	.if eax != NULL

		mov pstr, eax

		invoke SetupDiGetDeviceRegistryProperty, hDevInfo, addr DevInfoData, \
						SPDRP_HARDWAREID, addr dwDataType, pstr, cb, addr cb

		.if eax == FALSE
		
			invoke GetLastError
			
			.if eax == ERROR_INVALID_DATA

				; May be a Legacy Device with no HardwareID. Continue.

				xor eax, eax
				inc eax

			.else
				invoke wsprintf, addr buffer, $CTA0("SetupDiGetDeviceInterfaceDetail failed with error: %d\n"), eax
				invoke PrintConsole, addr buffer, 0

				xor eax, eax
			.endif
			
		.endif

		.if eax
			invoke wsprintf, addr buffer, $CTA0("\n\nDevice ID: %s\n"), pstr
			invoke PrintConsole, addr buffer, 0
		.endif
    
		invoke free, pstr

	.endif

ExitWithTrue:
	xor eax, eax
	inc eax
	ret					; return TRUE

ExitWithFalse:

⌨️ 快捷键说明

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