📄 symlinks.asm
字号:
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; SymLinks - Let you browse symbolic links
;
; Written by Four-F (four-f@mail.ru)
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.486
.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\w2k\ntstatus.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comctl32.inc
include \masm32\include\gdi32.inc
include \masm32\include\w2k\ntdll.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\w2k\ntdll.lib
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
include Macros.mac
include \masm32\Macros\Strings.mac
include ListView.mac
include memory.asm
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; E Q U A T E S
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
IDD_MAIN_DIALOG equ 100
IDC_LISTVIEW equ 101
IDI_MAIN_ICON equ 200
MAX_TEXT_LENGTH equ 128
IDM_ABOUT equ 2000
IDI_UP_ARROW equ 2001
IDI_DOWN_ARROW equ 2002
CX_HEADERBITMAP equ 9
CY_HEADERBITMAP equ 5
SORT_NOT_YET equ 0
SORT_ASCENDING equ 1
SORT_DESCENDING equ 2
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; R E A D O N L Y D A T A
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.const
g_szListViewClassName db "SysListView32", 0
szAbout db "About...", 0
szWrittenBy db "Symbolic Links Viewer v1.0", 0Ah, 0Dh
db "Compiled on "
date
db 0Ah, 0Dh, 0Ah, 0Dh
db "Written by Four-F <four-f@mail.ru>", 0
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; U N I N I T I A L I Z E D D A T A
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.data?
g_hInstance HINSTANCE ?
g_hDlg HWND ? ; global handle of the main dialog
g_hMainIcon HICON ?
g_hwndListView HWND ?
g_hwndHeader HWND ?
g_uPrevClickedColumn UINT ?
g_uSortOrder UINT ?
g_hbmpHeaderArrowUp HBITMAP ?
g_hbmpHeaderArrowDown HBITMAP ?
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; C O D E
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.code
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; CompareFunc
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CompareFunc proc uses edi lParam1:DWORD, lParam2:DWORD, uClickedColumn:UINT
local buffer[256]:CHAR
local buffer1[256]:CHAR
local lvi:LV_ITEM
mov lvi.imask,LVIF_TEXT
lea eax,buffer
mov lvi.pszText, eax
mov lvi.cchTextMax, sizeof buffer
push uClickedColumn
pop lvi.iSubItem
invoke SendMessage, g_hwndListView, LVM_GETITEMTEXT, lParam1, addr lvi
invoke lstrcpy, addr buffer1, addr buffer
invoke SendMessage, g_hwndListView, LVM_GETITEMTEXT, lParam2, addr lvi
.if g_uSortOrder == SORT_ASCENDING
invoke lstrcmpi, addr buffer1, addr buffer
.else
invoke lstrcmpi, addr buffer, addr buffer1
.endif
ret
CompareFunc endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; UpdatelParam
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
UpdatelParam proc uses edi
LOCAL lvi:LV_ITEM
invoke SendMessage, g_hwndListView, LVM_GETITEMCOUNT, 0, 0
mov edi, eax
mov lvi.imask, LVIF_PARAM
xor eax, eax
mov lvi.iSubItem, eax
mov lvi.iItem, eax
.while edi > 0
push lvi.iItem
pop lvi.lParam
invoke SendMessage, g_hwndListView, LVM_SETITEM, 0, addr lvi
inc lvi.iItem
dec edi
.endw
ret
UpdatelParam endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; LoadHeaderBitmap
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
LoadHeaderBitmap proc uses esi edi ecx edx ebx
mov g_hbmpHeaderArrowDown, $invoke(LoadImage, g_hInstance, IDI_DOWN_ARROW, IMAGE_BITMAP, CX_HEADERBITMAP, CY_HEADERBITMAP, LR_LOADMAP3DCOLORS)
mov g_hbmpHeaderArrowUp, $invoke(LoadImage, g_hInstance, IDI_UP_ARROW, IMAGE_BITMAP, CX_HEADERBITMAP, CY_HEADERBITMAP, LR_LOADMAP3DCOLORS)
ret
LoadHeaderBitmap endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; DeleteHeaderBitmap
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DeleteHeaderBitmap proc
invoke DeleteObject, g_hbmpHeaderArrowDown
invoke DeleteObject, g_hbmpHeaderArrowUp
ret
DeleteHeaderBitmap endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; ImageToHeaderItem
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ImageToHeaderItem proc hwndHeader:HWND, uColumn:UINT, hbmp:HBITMAP
; hbmp == NULL: Remove bitmap
LOCAL hdi:HD_ITEM
mov hdi.imask, HDI_FORMAT
invoke SendMessage, hwndHeader, HDM_GETITEM, uColumn, addr hdi
.if hbmp != NULL
mov hdi.imask, HDI_FORMAT + HDI_BITMAP
or hdi.fmt, HDF_BITMAP + HDF_BITMAP_ON_RIGHT
m2m hdi.hbm, hbmp
.else
mov hdi.imask, HDI_FORMAT
and hdi.fmt, NOT HDF_BITMAP
.endif
invoke SendMessage, hwndHeader, HDM_SETITEM, uColumn, addr hdi
ret
ImageToHeaderItem endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; InsertListViewColumn
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
InsertListViewColumn proc uses esi edi
local lvc:LV_COLUMN
lea esi, lvc
assume esi:PTR LV_COLUMN
mov edi, g_hwndListView
mov [esi].imask, LVCF_FMT + LVCF_TEXT + LVCF_WIDTH
mov [esi].fmt, LVCFMT_LEFT
mov [esi].pszText, $CTA0("Name")
mov [esi].lx, 300
ListView_InsertColumn edi, 0, esi
mov [esi].pszText, $CTA0("Links To")
ListView_InsertColumn edi, 1, esi
assume esi:nothing
ret
InsertListViewColumn endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; FillListView
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FillListView proc uses esi edi ebx
local lvi:LV_ITEM
local buffer[1024]:CHAR
local lvc:LVCOLUMN
;local pMemory:LPVOID
invoke SendMessage, g_hwndListView, WM_SETREDRAW, FALSE, 0
ListView_DeleteAllItems g_hwndListView
xor edi, edi
mov ebx, 1000h ; start with one page
.while TRUE
invoke malloc, ebx
.break .if eax == 0
mov edi, eax
invoke QueryDosDevice, NULL, edi, ebx
.break .if eax != 0
invoke GetLastError
push eax
invoke free, edi
xor edi, edi
pop eax
.break .if eax != ERROR_INSUFFICIENT_BUFFER ; something strange
shl ebx, 1 ; ask twice more memory
.break .if ebx > 1000h * 1000 ; 1000 pages should be enough anyway
.endw
.if edi != NULL
lea esi, lvi
assume esi:ptr LV_ITEM
mov [esi].imask, LVIF_TEXT
and lvi.iItem, 0
mov ebx, edi
.if byte ptr [ebx] != 0
.while TRUE
invoke QueryDosDevice, ebx, addr buffer, sizeof buffer
.if eax != 0
and lvi.iSubItem, 0
mov [esi].pszText, ebx
ListView_InsertItem g_hwndListView, esi
inc lvi.iSubItem
lea eax, buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -