NT4/private/sdktools/winobj/wffsc.asm
2020-09-30 17:12:29 +02:00

100 lines
2.3 KiB
NASM

;****************************************************************************
;* *
;* WFFSC.ASM - *
;* *
;* WINFILE's File System Change Notification Handler *
;* *
;****************************************************************************
include winfile.inc
;=============================================================================
externFP lstrlen
externFP lstrcpy
externFP LocalAlloc
externFP PostMessage
createSeg _%SEGNAME, %SEGNAME, WORD, PUBLIC, CODE
sBegin %SEGNAME
assumes CS,%SEGNAME
assumes DS,DATA
;*--------------------------------------------------------------------------*
;* *
;* KernelChangeFileSystem() - *
;* *
;*--------------------------------------------------------------------------*
cProc KernelChangeFileSystem, <FAR, PUBLIC>, <SI, DI>
parmW wDosFunc
parmD lpFile
localW handle
cBegin
cmp wDosFunc,4300h ; Is it get attributes?
je KCFSExit ; Yup, skip
; Alloc a local buffer for the file's name.
les si,lpFile
push es
push si
call lstrlen
inc ax ; Skip the NULL
; Is this a RENAME command?
cmp wDosFunc,5600h
jne KCFSAllocIt ; Nope, Skip
; Yup, add the length of the second string.
mov di,ax ; DI = Length of first string
add si,di ; SI points to second string
push es
push si
call lstrlen
add ax,di ; Add length of first string
inc ax ; Include the NULL
KCFSAllocIt:
mov di,ax ; DI = Number of chars to copy
mov dx,LMEM_NODISCARD or LMEM_NOCOMPACT or LMEM_FIXED
cCall LocalAlloc,<dx,di>
or ax,ax
jz KCFSExit
mov handle,ax ; Save the handle
; Copy the file's name into local storage.
push ds ; Save DS
mov cx,di ; CX = Length
push ds
pop es
mov di,ax ; ES:DI = Destination
lds si,lpFile ; DS:SI = Source
cld
rep movsb ; Copy
pop ds ; Restore DS
; Compute the proper FSC_ value for wParam.
mov ax,wDosFunc
xchg ah,al
mov ah,80h ; high bit -> dos function, not FSC
sub dx,dx
mov cx,WM_FILESYSCHANGE
; Post the message.
cCall PostMessage,<_hwndFrame,cx,ax,dx,handle>
KCFSExit:
cEnd
sEnd
end