📄 drivelayout.bat
字号:
;@echo off
;goto make
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; 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\advapi32.inc
include \masm32\include\comctl32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\comctl32.lib
;include \masm32\include\w2k\ntddk.inc
include \masm32\include\w2k\devioctl.inc
;include \masm32\include\w2k\ntddstor.inc
;include \masm32\include\w2k\ntdddisk.inc
include cocomac\cocomac.mac
include cocomac\ListView.mac
include \masm32\Macros\Strings.mac
; ntdddisk.inc
IFNDEF CTL_CODE
CTL_CODE MACRO DeviceType:=<0>, Function:=<0>, Method:=<0>, Access:=<0>
EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method))
ENDM
ENDIF
IOCTL_DISK_BASE equ FILE_DEVICE_DISK
IOCTL_DISK_GET_DRIVE_LAYOUT equ CTL_CODE(IOCTL_DISK_BASE, 0003, METHOD_BUFFERED, FILE_READ_ACCESS)
; because of bad definition in windows.inc
_LARGE_INTEGER UNION
struct
LowPart DWORD ?
HighPart SDWORD ?
ends
struct u
LowPart DWORD ?
HighPart SDWORD ?
ends
QuadPart QWORD ? ; signed
_LARGE_INTEGER ENDS
P_LARGE_INTEGER typedef PTR _LARGE_INTEGER
; The following structure is returned on an IOCTL_DISK_GET_PARTITION_INFO
; and an IOCTL_DISK_GET_DRIVE_LAYOUT request. It is also used in a request
; to change the drive layout, IOCTL_DISK_SET_DRIVE_LAYOUT.
IFNDEF PARTITION_INFORMATION ; winioctl.inc also
PARTITION_INFORMATION STRUCT ; sizeof = 20h
StartingOffset _LARGE_INTEGER <>
PartitionLength _LARGE_INTEGER <>
HiddenSectors DWORD ?
PartitionNumber DWORD ?
PartitionType BYTE ?
BootIndicator BOOLEAN ?
RecognizedPartition BOOLEAN ?
RewritePartition BOOLEAN ?
DWORD ? ; padding
PARTITION_INFORMATION ENDS
PPARTITION_INFORMATION typedef ptr PARTITION_INFORMATION
ENDIF
; The following structures is returned on an IOCTL_DISK_GET_DRIVE_LAYOUT
; request and given as input to an IOCTL_DISK_SET_DRIVE_LAYOUT request.
IFNDEF DRIVE_LAYOUT_INFORMATION ; winioctl.inc also
DRIVE_LAYOUT_INFORMATION STRUCT ; sizeof = 28h
PartitionCount DWORD ?
Signature DWORD ?
PartitionEntry PARTITION_INFORMATION 1 dup(<>)
DRIVE_LAYOUT_INFORMATION ENDS
PDRIVE_LAYOUT_INFORMATION typedef ptr DRIVE_LAYOUT_INFORMATION
ENDIF
; Define the partition types returnable by known disk drivers.
PARTITION_ENTRY_UNUSED equ 00 ; Entry unused
PARTITION_FAT_12 equ 01 ; 12-bit FAT entries
PARTITION_XENIX_1 equ 02 ; Xenix
PARTITION_XENIX_2 equ 03 ; Xenix
PARTITION_FAT_16 equ 04 ; 16-bit FAT entries
PARTITION_EXTENDED equ 05 ; Extended partition entry
PARTITION_HUGE equ 06 ; Huge partition MS-DOS V4
PARTITION_IFS equ 07 ; IFS Partition
PARTITION_OS2BOOTMGR equ 0Ah ; OS/2 Boot Manager/OPUS/Coherent swap
PARTITION_FAT32 equ 0Bh ; FAT32
PARTITION_FAT32_XINT13 equ 0Ch ; FAT32 using extended int13 services
PARTITION_XINT13 equ 0Eh ; Win95 partition using extended int13 services
PARTITION_XINT13_EXTENDED equ 0Fh ; Same as type 5 but uses extended int13 services
PARTITION_PREP equ 41h ; PowerPC Reference Platform (PReP) Boot Partition
PARTITION_LDM equ 42h ; Logical Disk Manager partition
PARTITION_UNIX equ 63h ; Unix
VALID_NTFT equ C0h ; NTFT uses high order bits
; The high bit of the partition type code indicates that a partition
; is part of an NTFT mirror or striped array.
PARTITION_NTFT equ 80h ; NTFT partition
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; M A C R O S
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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
IDC_LISTVIEW equ 1001
IDI_ICON equ 1002
IDM_ABOUT equ 2000
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; U N I N I T I A L I Z E D D A T A
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.data?
g_hInstance HINSTANCE ?
g_hwndDlg HWND ?
g_hwndListView HWND ?
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; R E A D O N L Y D A T A
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.const
szAbout db "About...", 0
szWrittenBy db "Drive Layout Information v1.0", 0Ah, 0Dh
db "Built on "
date
db 0Ah, 0Dh, 0Ah, 0Dh
db "Written by Four-F <four-f@mail.ru>", 0
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; C O D E
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.code
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; malloc
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
malloc proc dwBytes:DWORD
option PROLOGUE:NONE
option EPILOGUE:NONE
invoke GetProcessHeap
invoke HeapAlloc, eax, 0, [esp+4]
ret 4
option PROLOGUE:PROLOGUEDEF
option EPILOGUE:EPILOGUEDEF
malloc endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; delete
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
free proc lpMem:PVOID
option PROLOGUE:NONE
option EPILOGUE:NONE
invoke GetProcessHeap
invoke HeapFree, eax, 0, [esp+4]
ret 4
option PROLOGUE:PROLOGUEDEF
option EPILOGUE:EPILOGUEDEF
free endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; FillDriveLayoutInfo
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FillDriveLayoutInfo proc uses esi edi ebx
local lvi:LV_ITEM
local i:DWORD
local hDevice:HANDLE
local dwBytesReturned:DWORD
local cb:DWORD
local pdli:PDRIVE_LAYOUT_INFORMATION
local buffer[512]:CHAR
mov esi, pdli
assume esi:ptr DRIVE_LAYOUT_INFORMATION
mov lvi.imask, LVIF_TEXT
or lvi.iItem, -1
mov cb, sizeof DRIVE_LAYOUT_INFORMATION + sizeof PARTITION_INFORMATION * 511
invoke malloc, cb
.if eax != NULL
mov pdli, eax
and i, 0
.while i < 32
invoke wsprintf, addr buffer, $CTA0("\\Device\\Harddisk%d\\Partition%d"), i, 0
invoke DefineDosDevice, DDD_RAW_TARGET_PATH, $CTA0("HarddiskXPartitionX"), addr buffer
.if eax != 0
invoke CreateFile, $CTA0("\\\\.\\HarddiskXPartitionX"), GENERIC_READ, \
FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
.if eax != INVALID_HANDLE_VALUE
mov hDevice, eax
invoke DeviceIoControl, hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT, NULL, 0, \
pdli, cb, addr dwBytesReturned, NULL
.if eax != 0
mov esi, pdli
assume esi:ptr DRIVE_LAYOUT_INFORMATION
lea edi, [esi].PartitionEntry
assume edi:ptr PARTITION_INFORMATION
xor ebx, ebx
.while ebx < [esi].PartitionCount
inc ebx ; Make it one-based
.if [edi].RecognizedPartition
invoke wsprintf, addr buffer, \
$CTA0("\\Device\\Harddisk%d\\Partition%d"), \
i, [edi].PartitionNumber
inc lvi.iItem
and lvi.iSubItem, 0
lea eax, buffer
mov lvi.pszText, eax
ListView_InsertItem g_hwndListView, addr lvi
inc lvi.iSubItem
.if [edi].StartingOffset.HighPart != 0
invoke wsprintf, addr buffer, $CTA0("%x%08x"), \
[edi].StartingOffset.HighPart, [edi].StartingOffset.LowPart
.else
invoke wsprintf, addr buffer, $CTA0("%x"), \
[edi].StartingOffset.LowPart
.endif
lea eax, buffer
mov lvi.pszText, eax
ListView_SetItem g_hwndListView, addr lvi
inc lvi.iSubItem
.if [edi].PartitionLength.HighPart != 0
invoke wsprintf, addr buffer, $CTA0("%x%08x"), \
[edi].PartitionLength.HighPart, [edi].PartitionLength.LowPart
.else
invoke wsprintf, addr buffer, $CTA0("%x"), \
[edi].PartitionLength.LowPart
.endif
lea eax, buffer
mov lvi.pszText, eax
ListView_SetItem g_hwndListView, addr lvi
inc lvi.iSubItem
invoke wsprintf, addr buffer, $CTA0("%d"), \
[edi].HiddenSectors
lea eax, buffer
mov lvi.pszText, eax
ListView_SetItem g_hwndListView, addr lvi
inc lvi.iSubItem
.if [edi].BootIndicator
mov lvi.pszText, $CTA0("*")
.else
mov lvi.pszText, $CTA0("")
.endif
ListView_SetItem g_hwndListView, addr lvi
inc lvi.iSubItem
movzx eax, [edi].PartitionType
.if eax & PARTITION_NTFT
mov lvi.pszText, $CTA0("*")
.else
mov lvi.pszText, $CTA0("")
.endif
ListView_SetItem g_hwndListView, addr lvi
inc lvi.iSubItem
movzx eax, [edi].PartitionType
; PARTITION_NTFT is used in combination (that is, bitwise
; logically ORed) with the other values
and eax, not PARTITION_NTFT
.if eax == PARTITION_ENTRY_UNUSED
mov lvi.pszText, $CTA0("Unused entry")
.elseif eax == PARTITION_FAT_12
mov lvi.pszText, $CTA0("A partition with 12-bit FAT entries")
.elseif eax == PARTITION_XENIX_1
mov lvi.pszText, $CTA0("A XENIX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -