mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
824 lines
24 KiB
824 lines
24 KiB
;-------------------------------
|
|
; CVT.INC MUST BE INCLUDED FIRST
|
|
;-------------------------------
|
|
|
|
include cvt.inc
|
|
|
|
|
|
;==============================================================================
|
|
; repack TEXTMETRIC from 32-bit to 16-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_TEXTMETRIC_32_16 macro fEmbedded
|
|
|
|
lodsd ;tmHeight
|
|
stosw
|
|
|
|
lodsd ;tmAscent
|
|
stosw
|
|
|
|
lodsd ;tmDescent
|
|
stosw
|
|
|
|
lodsd ;tmInternalLeading
|
|
stosw
|
|
|
|
lodsd ;tmExternalLeading
|
|
stosw
|
|
|
|
lodsd ;tmAveCharWidth
|
|
stosw
|
|
|
|
lodsd ;tmMaxCharWidth
|
|
stosw
|
|
|
|
lodsd ;tmWeight
|
|
stosw
|
|
|
|
add esi,(4+4+4)
|
|
|
|
;32-bit order --> 16-bit order
|
|
;--------------------------------------
|
|
;tmFirstChar tmItalic
|
|
;tmLastChar tmUnderlined
|
|
;tmDefaultChar tmStruckOut
|
|
;tmBreakChar tmFirstChar
|
|
;tmItalic tmLastChar
|
|
;tmUnderlined tmDefaultChar
|
|
;tmStruckOut tmBreakChar
|
|
;tmPitchAndFamily tmPitchAndFamily
|
|
;tmCharSet tmCharSet
|
|
|
|
mov eax,[esi+4]
|
|
stosd ;;only three bytes valid
|
|
dec edi
|
|
mov eax,[esi+0]
|
|
stosd
|
|
mov ax,[esi+7]
|
|
stosw
|
|
|
|
sub esi,(4+4+4)
|
|
|
|
lodsd ;tmOverhang
|
|
stosw
|
|
|
|
lodsd ;tmDigitizedAspectX
|
|
stosw
|
|
|
|
lodsd ;tmDigitizedAspectY
|
|
stosw
|
|
|
|
ifnb <fEmbedded>
|
|
;;Keep esi in sync since this macro is embedded in another.
|
|
add esi,9
|
|
endif
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack TEXTMETRIC from 16-bit to 32-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_TEXTMETRIC_16_32 macro fEmbedded
|
|
lodsw ;tmHeight
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmAscent
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmDescent
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmInternalLeading
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmExternalLeading
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmAveCharWidth
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmMaxCharWidth
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmWeight
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
add esi,9
|
|
|
|
lodsw ;tmOverhang
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmDigitizedAspectX
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;tmDigitizedAspectY
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
sub esi,(2+2+2+9)
|
|
|
|
;16-bit order --> 32-bit order
|
|
;--------------------------------------
|
|
;tmItalic tmFirstChar
|
|
;tmUnderlined tmLastChar
|
|
;tmStruckOut tmDefaultChar
|
|
;tmFirstChar tmBreakChar
|
|
;tmLastChar tmItalic
|
|
;tmDefaultChar tmUnderlined
|
|
;tmBreakChar tmStruckOut
|
|
;tmPitchAndFamily tmPitchAndFamily
|
|
;tmCharSet tmCharSet
|
|
|
|
mov eax,[esi+3] ;First Last Default Break-char
|
|
stos dword ptr es:[edi]
|
|
mov eax,[esi+0] ;
|
|
stos dword ptr es:[edi] ;Italic Underlined StruckOut
|
|
dec edi ;
|
|
mov ax,[esi+7]
|
|
stos word ptr es:[edi] ;Pitch CharSet
|
|
|
|
ifnb <fEmbedded>
|
|
;;Keep esi in sync since this macro is embedded in another.
|
|
add esi,(2+2+2+9)
|
|
endif
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
;==============================================================================
|
|
PACK_POINT_16_32 macro
|
|
ncopysx 2
|
|
endm
|
|
|
|
;==============================================================================
|
|
;==============================================================================
|
|
PACK_RECT_32_16 macro
|
|
ncopyt 4
|
|
endm
|
|
|
|
PACK_RECT_16_32 macro
|
|
ncopysx 4
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
;==============================================================================
|
|
PACK_PANOSE_16_32 macro
|
|
;copy ten bytes
|
|
;;;; sub eax,eax
|
|
;;;; stos dword ptr es:[edi] ;!!! kirko says this will disappear
|
|
|
|
lodsd
|
|
stos dword ptr es:[edi]
|
|
lodsd
|
|
stos dword ptr es:[edi]
|
|
lodsw
|
|
stos word ptr es:[edi]
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack OUTLINETEXTMETRIC from 16-bit to 32-bit
|
|
;
|
|
; Requirements:
|
|
; DS:ESI --> source (16-bit)
|
|
; ES:EDI --> dest (32-bit)
|
|
;==============================================================================
|
|
|
|
OUTLINETEXTMETRIC16_SIZE equ 114
|
|
OUTLINETEXTMETRIC32_SIZE equ 212
|
|
|
|
PACK_OUTLINETEXTMETRIC_16_32 macro
|
|
|
|
COPY_STRING macro
|
|
local loop_top
|
|
loop_top:
|
|
lodsb
|
|
stos byte ptr es:[edi]
|
|
or al,al
|
|
jnz loop_top
|
|
endm
|
|
|
|
COPY_OTM_STRING macro last
|
|
mov cx,si ;;save source ptr into struct
|
|
mov si,[si] ;;get offset to chars
|
|
add si,bx ;;add in base
|
|
COPY_STRING ;;copy characters
|
|
mov si,cx ;;restore source ptr into struct
|
|
ifb <last>
|
|
add si,2 ;;next offset in struct
|
|
endif
|
|
endm
|
|
|
|
COPY_ADJUSTED_OFFSET macro
|
|
lodsw
|
|
movzx eax,ax
|
|
add eax,OUTLINETEXTMETRIC32_SIZE - OUTLINETEXTMETRIC16_SIZE
|
|
stos dword ptr es:[edi]
|
|
endm
|
|
|
|
mov bx,si ;;save copy for strings at end
|
|
|
|
COPY_ADJUSTED_OFFSET ;otmSize
|
|
|
|
PACK_TEXTMETRIC_16_32 embedded ;otmTextMetrics
|
|
|
|
lodsb ;otmFiller
|
|
stosb es:[edi] ;
|
|
|
|
add edi, 3 ;DWORD align otmPanoseNumber
|
|
|
|
PACK_PANOSE_16_32 ;otmPanoseNumber
|
|
|
|
add edi, 1 ;DWORD align otmfsSelection
|
|
|
|
UMAP_WORDTODWORD ;otmfsSelection;
|
|
UMAP_WORDTODWORD ;otmfsType;
|
|
UMAP_WORDTODWORD ;otmsCharSlopeRise;
|
|
UMAP_WORDTODWORD ;otmsCharSlopeRun;
|
|
UMAP_INTTOLONG ;otmItalicAngle;
|
|
UMAP_WORDTODWORD ;otmEMSquare;
|
|
UMAP_WORDTODWORD ;otmAscent;
|
|
UMAP_INTTOLONG ;otmDescent;
|
|
UMAP_INTTOLONG ;otmLineGap;
|
|
UMAP_WORDTODWORD ;otmXHeight;
|
|
UMAP_WORDTODWORD ;otmCapEmHeight;
|
|
PACK_RECT_16_32 ;otmrcFontBox;
|
|
UMAP_INTTOLONG ;otmMacAscent;
|
|
UMAP_INTTOLONG ;otmMacDescent;
|
|
UMAP_WORDTODWORD ;otmMacLineGap;
|
|
UMAP_WORDTODWORD ;otmusMinimumPPEM;
|
|
PACK_POINT_16_32 ;otmptSubscriptSize;
|
|
PACK_POINT_16_32 ;otmptSubscriptOffset;
|
|
PACK_POINT_16_32 ;otmptSuperscriptSize;
|
|
PACK_POINT_16_32 ;otmptSuperscriptOffset;
|
|
UMAP_WORDTODWORD ;otmsStrikeoutSize;
|
|
UMAP_INTTOLONG ;otmsStrikeoutPosition;
|
|
|
|
; Need to flip otmUnderscorePosition and otmUnderscoreSize
|
|
|
|
movzx eax, word ptr [si+2] ; otmUnderscoreSize
|
|
stosd es:[edi] ;
|
|
movsx eax, word ptr [si] ; otmUnderscorePosition
|
|
stosd es:[edi] ;
|
|
add si, 4 ;
|
|
|
|
COPY_ADJUSTED_OFFSET ;otmpFamilyName;
|
|
COPY_ADJUSTED_OFFSET ;otmpFaceName;
|
|
COPY_ADJUSTED_OFFSET ;otmpStyleName;
|
|
COPY_ADJUSTED_OFFSET ;otmpFullName;
|
|
|
|
;;Rewind source to first of string offsets
|
|
sub si,2*4
|
|
|
|
COPY_OTM_STRING
|
|
COPY_OTM_STRING
|
|
COPY_OTM_STRING
|
|
COPY_OTM_STRING last
|
|
|
|
purge COPY_STRING
|
|
purge COPY_OTM_STRING
|
|
purge COPY_ADJUSTED_OFFSET
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack NEWTEXTMETRIC from 16-bit to 32-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_NEWTEXTMETRIC_16_32 macro
|
|
PACK_TEXTMETRIC_16_32 embedded
|
|
|
|
add edi,3 ;padding bytes
|
|
|
|
lodsd ;ntmFlags
|
|
stos dword ptr es:[edi]
|
|
|
|
sub eax,eax
|
|
|
|
lodsw ;ntmSizeEM
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;ntmCellHeight
|
|
stos dword ptr es:[edi]
|
|
|
|
lodsw ;ntmAvgWidth
|
|
stos dword ptr es:[edi]
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack LOGFONT from 32-bit to 16-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_LOGFONT_32_16 macro
|
|
lodsd ;lfHeight
|
|
stosw
|
|
lodsd ;lfWidth
|
|
stosw
|
|
lodsd ;lfEscapement
|
|
stosw
|
|
lodsd ;lfOrientation
|
|
stosw
|
|
lodsd ;lfWeight
|
|
stosw
|
|
|
|
;These are all BYTE fields:
|
|
;lfItalic
|
|
;lfUnderline
|
|
;lfStrikeOut
|
|
;lfCharSet
|
|
;lfOutPrecision
|
|
;lfClipPrecision
|
|
;lfQuality
|
|
;lfPitchAndFamily
|
|
;lfFaceName[32]
|
|
|
|
mov ecx,40/4
|
|
rep movsd
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack LOGFONT from 16-bit to 32-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_LOGFONT_16_32 macro
|
|
lodsw ;lfHeight
|
|
cwde
|
|
stosd
|
|
lodsw ;lfWidth
|
|
cwde
|
|
stosd
|
|
lodsw ;lfEscapement
|
|
cwde
|
|
stosd
|
|
lodsw ;lfOrientation
|
|
cwde
|
|
stosd
|
|
lodsw ;lfWeight
|
|
cwde
|
|
stosd
|
|
|
|
;These are all BYTE fields:
|
|
;lfItalic
|
|
;lfUnderline
|
|
;lfStrikeOut
|
|
;lfCharSet
|
|
;lfOutPrecision
|
|
;lfClipPrecision
|
|
;lfQuality
|
|
;lfPitchAndFamily
|
|
;lfFaceName[32]
|
|
|
|
mov ecx,40/4
|
|
rep movsd
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; Convert MLOGFONT 32->16
|
|
;
|
|
;==============================================================================
|
|
PACK_MLOGFONT_32_16 macro
|
|
ncopyt 5
|
|
ncopyd 40/4
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; Convert MLOGFONT 16->32
|
|
;
|
|
;==============================================================================
|
|
PACK_MLOGFONT_16_32 macro
|
|
ncopysx 5
|
|
ncopyd 40/4
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack ENUMLOGFONT from 16-bit to 32-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_ENUMLOGFONT_16_32 macro
|
|
lodsw ;lfHeight
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
lodsw ;lfWidth
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
lodsw ;lfEscapement
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
lodsw ;lfOrientation
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
lodsw ;lfWeight
|
|
cwde
|
|
stos dword ptr es:[edi]
|
|
|
|
;These are all BYTE fields:
|
|
;lfItalic
|
|
;lfUnderline
|
|
;lfStrikeOut
|
|
;lfCharSet
|
|
;lfOutPrecision
|
|
;lfClipPrecision
|
|
;lfQuality
|
|
;lfPitchAndFamily
|
|
;lfFaceName[32]
|
|
;elfFullName[64]
|
|
;elfStyle[32]
|
|
|
|
mov ecx,136/4
|
|
rep movs dword ptr es:[edi],dword ptr ds:[esi]
|
|
endm
|
|
|
|
|
|
;==============================================================================
|
|
; repack BITMAP from 32-bit to 16-bit
|
|
;
|
|
;==============================================================================
|
|
PACK_BITMAP_32_16 macro
|
|
lodsd ;bmType
|
|
stosw
|
|
|
|
lodsd ;bmWidth
|
|
stosw
|
|
|
|
lodsd ;bmHeight
|
|
stosw
|
|
|
|
lodsd ;bmWidthBytes
|
|
stosw
|
|
|
|
lodsw ;bmPlanes
|
|
stosb
|
|
|
|
lodsw ;bmBitsPixel
|
|
stosb
|
|
|
|
movsd ;bmBits
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; Printer api thunk stuff
|
|
;-----------------------------------------------------------------------;
|
|
DEVMODECOMMON struc
|
|
dmDeviceName db 32 dup (?)
|
|
dmSpecVersion dw ?
|
|
dmDriverVersion dw ?
|
|
dmSize dw ?
|
|
dmDriverExtra dw ?
|
|
dmFields dd ?
|
|
dmOrientation dw ?
|
|
dmPaperSize dw ?
|
|
dmPaperLength dw ?
|
|
dmPaperWidth dw ?
|
|
dmScale dw ?
|
|
dmCopies dw ?
|
|
dmDefaultSource dw ?
|
|
dmPrintQuality dw ?
|
|
dmColor dw ?
|
|
dmDuplex dw ?
|
|
dmYResolution dw ?
|
|
dmTTOption dw ?
|
|
DEVMODECOMMON ends
|
|
|
|
DEVMODE16 struc
|
|
dmCommon db size DEVMODECOMMON dup (?)
|
|
DEVMODE16 ends
|
|
|
|
DEVMODE32 struc
|
|
dmCommon db size DEVMODECOMMON dup (?)
|
|
dmCollate dw ?
|
|
dmFormName db 32 dup (?)
|
|
dmUnusedPadding dw ?
|
|
dmBitsPerPel dw ?
|
|
dmPelsWidth dd ?
|
|
dmPelsHeight dd ?
|
|
dmDisplayMode dd ?
|
|
DEVMODE32 ends
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; REPACK_DEVMODE_32_16
|
|
;
|
|
; Entry:
|
|
; DS:ESI --> 32-bit source (ESI might be flat offset)
|
|
; ES:EDI --> 16-bit destination (EDI is zero-extended from DI)
|
|
; direction flag cleared
|
|
;-----------------------------------------------------------------------;
|
|
REPACK_DEVMODE_32_16 macro
|
|
local done
|
|
|
|
;Move the common part as a single block move.
|
|
MoveBytes <(size DEVMODECOMMON)>
|
|
|
|
;Update the dmSize field
|
|
mov es:[di].(dmSize - (size DEVMODECOMMON)),size DEVMODE16
|
|
|
|
;!!!Clear out any win32-only flags
|
|
;and es:[di].(dmFields - (size DEVMODECOMMON)),0FFFFh
|
|
|
|
;Insert win16-only fields. EDI points to the byte after
|
|
;DEVMODECOMMON. Afterwards, will point to byte after DEVMODE16.
|
|
;ZeroBytes <((size DEVMODE16) - (size DEVMODECOMMON))>
|
|
|
|
;Skip over the extra win32 fields. ESI still points to the byte
|
|
;after DEVMODECOMMON.
|
|
add esi,(size DEVMODE32) - (size DEVMODECOMMON)
|
|
|
|
;Move the driver-dependent part. EDI points to the byte after
|
|
;DEVMODE16.
|
|
mov cx,es:[di].(dmDriverExtra - (size DEVMODE16))
|
|
jcxz done
|
|
|
|
movzx ecx,cx
|
|
mov edx,ecx
|
|
shr cx,2
|
|
and dx,3
|
|
rep movs dword ptr es:[edi],dword ptr ds:[esi]
|
|
mov cx,dx
|
|
rep movs byte ptr es:[edi],byte ptr ds:[esi]
|
|
done:
|
|
endm
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; REPACK_DEVMODE_16_32
|
|
;
|
|
; Entry:
|
|
; DS:ESI --> 16-bit destination (ESI is zero-extended from SI)
|
|
; ES:EDI --> 32-bit source (EDI might be flat offset)
|
|
; direction flag cleared
|
|
;-----------------------------------------------------------------------;
|
|
REPACK_DEVMODE_16_32 macro
|
|
local done
|
|
|
|
;Move the common part as a single block move.
|
|
MoveBytes <(size DEVMODECOMMON)>
|
|
|
|
;Update the dmSize field
|
|
mov es:[edi].(dmSize - (size DEVMODECOMMON)),size DEVMODE32
|
|
|
|
;Insert the win32-only fields (advances EDI to end of DEVMODE32)
|
|
ZeroBytes <((size DEVMODE32) - (size DEVMODECOMMON))>
|
|
|
|
;Move the driver-dependent part. SI points to the byte after
|
|
;DEVMODECOMMON.
|
|
movzx ecx,[si].(dmDriverExtra - (size DEVMODECOMMON))
|
|
jcxz done
|
|
|
|
mov edx,ecx
|
|
shr cx,2
|
|
and dx,3
|
|
rep movs dword ptr es:[edi],dword ptr ds:[esi]
|
|
mov cx,dx
|
|
rep movs byte ptr es:[edi],byte ptr ds:[esi]
|
|
done:
|
|
endm
|
|
|
|
|
|
OLETARGETDEVICE16 struc
|
|
otd16DeviceNameOffset dw ?
|
|
otd16DriverNameOffset dw ?
|
|
otd16PortNameOffset dw ?
|
|
otd16ExtDevmodeOffset dw ?
|
|
otd16ExtDevmodeSize dw ?
|
|
otd16EnvironmentOffset dw ?
|
|
otd16EnvironmentSize dw ?
|
|
;otd16Data[1] db 1 dup (?)
|
|
OLETARGETDEVICE16 ends
|
|
|
|
OLETARGETDEVICE32 struc
|
|
otd32DeviceNameOffset dd ?
|
|
otd32DriverNameOffset dd ?
|
|
otd32PortNameOffset dd ?
|
|
otd32ExtDevmodeOffset dd ?
|
|
otd32ExtDevmodeSize dd ?
|
|
otd32EnvironmentOffset dd ?
|
|
otd32EnvironmentSize dd ?
|
|
;otd32Data[1] db 1 dup (?)
|
|
OLETARGETDEVICE32 ends
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; REPACK_OLETARGETDEVICE_32_16
|
|
;
|
|
; Entry:
|
|
; DS:ESI --> 32-bit source (ESI might be flat offset)
|
|
; ES:EDI --> 16-bit destination (EDI is zero-extended from DI)
|
|
; direction flag cleared
|
|
;-----------------------------------------------------------------------;
|
|
REPACK_OLETARGETDEVICE_32_16 macro
|
|
|
|
; Entry:
|
|
; DS:ESI --> 32-bit source (ESI might be flat offset)
|
|
; ES:EDI --> 16-bit destination (EDI is zero-extended from DI)
|
|
; ES:BX --> 16-bit structure base
|
|
; direction flag cleared
|
|
;
|
|
; Exit:
|
|
; DS:ESI preserved
|
|
; ES:EDI updated
|
|
; ES:BX preserved
|
|
|
|
MOVE_STRING macro foo
|
|
local loop_top
|
|
|
|
push esi ;save original source
|
|
|
|
add esi,[esi].otd32&foo&Offset
|
|
add esi,size OLETARGETDEVICE32
|
|
|
|
mov ax,di ;current offset
|
|
sub ax,bx ;offset from base
|
|
sub ax,size OLETARGETDEVICE16 ;offsets start from end
|
|
mov es:[bx].otd16&foo&Offset,ax ;store new offset
|
|
|
|
loop_top:
|
|
mov al,[esi]
|
|
mov es:[di],al
|
|
inc esi
|
|
inc di
|
|
or al,al
|
|
jnz loop_top
|
|
|
|
pop esi
|
|
endm
|
|
|
|
; Entry:
|
|
; DS:ESI --> 32-bit source (ESI might be flat offset)
|
|
; ES:EDI --> 16-bit destination (EDI is zero-extended from DI)
|
|
; ES:BX --> 16-bit structure base
|
|
; direction flag cleared
|
|
;
|
|
; Exit:
|
|
; DS:ESI preserved
|
|
; ES:EDI updated
|
|
; ES:BX preserved
|
|
|
|
MOVE_DEVMODE macro foo
|
|
local exit, empty_fields
|
|
|
|
mov eax,[esi].otd32&foo&Size
|
|
or eax,eax
|
|
jz empty_fields
|
|
|
|
push esi ;save original source
|
|
push bx ;base pointer
|
|
|
|
add esi,[esi].otd32&foo&Offset
|
|
add esi,size OLETARGETDEVICE32
|
|
|
|
mov ax,di ;current offset
|
|
sub ax,bx ;offset from base
|
|
sub ax,size OLETARGETDEVICE16 ;offsets start from end
|
|
mov es:[bx].otd16&foo&Offset,ax ;store new offset
|
|
|
|
REPACK_DEVMODE_32_16
|
|
|
|
pop bx ;restore base pointer
|
|
pop esi
|
|
|
|
mov ax,di
|
|
sub ax,es:[bx].otd16&foo&Offset
|
|
mov es:[bx].otd16&foo&Size,ax ;store new size
|
|
jmp short exit
|
|
|
|
empty_fields:
|
|
mov es:[bx].otd16&foo&Offset,ax ;store null offset
|
|
mov es:[bx].otd16&foo&Size,ax ;store null size
|
|
|
|
exit:
|
|
endm
|
|
|
|
mov bx,di
|
|
add di,size OLETARGETDEVICE16 ;put first string here
|
|
|
|
MOVE_STRING DeviceName
|
|
MOVE_STRING DriverName
|
|
MOVE_STRING PortName
|
|
MOVE_DEVMODE ExtDevmode
|
|
MOVE_DEVMODE Environment
|
|
|
|
purge MOVE_STRING
|
|
purge MOVE_DEVMODE
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; REPACK_OLETARGETDEVICE_16_32
|
|
;
|
|
; Entry:
|
|
; DS:ESI --> 16-bit source (ESI is zero-extended from SI)
|
|
; ES:EDI --> 32-bit destination (EDI might be flat offset)
|
|
; direction flag cleared
|
|
;-----------------------------------------------------------------------;
|
|
REPACK_OLETARGETDEVICE_16_32 macro
|
|
|
|
; Entry:
|
|
; DS:ESI --> 16-bit source (ESI is zero-extended from DI)
|
|
; ES:EDI --> 32-bit destination (EDI might be flat offset)
|
|
; ES:EBX --> 32-bit structure base
|
|
; direction flag cleared
|
|
;
|
|
; Exit:
|
|
; DS:ESI preserved
|
|
; ES:EDI updated
|
|
; ES:EBX preserved
|
|
|
|
MOVE_STRING macro foo
|
|
local loop_top
|
|
|
|
push si ;save original source
|
|
|
|
add si,[si].otd16&foo&Offset
|
|
add si,size OLETARGETDEVICE16
|
|
|
|
mov eax,edi ;current offset
|
|
sub eax,ebx ;offset from base
|
|
sub eax,size OLETARGETDEVICE32 ;offsets start from end
|
|
mov es:[ebx].otd32&foo&Offset,eax ;store new offset
|
|
|
|
loop_top:
|
|
mov al,[si]
|
|
mov es:[edi],al
|
|
inc si
|
|
inc edi
|
|
or al,al
|
|
jnz loop_top
|
|
|
|
pop si
|
|
endm
|
|
|
|
; Entry:
|
|
; DS:ESI --> 16-bit source (ESI is zero-extended from DI)
|
|
; ES:EDI --> 32-bit destination (EDI might be flat offset)
|
|
; ES:EBX --> 32-bit structure base
|
|
; direction flag cleared
|
|
;
|
|
; Exit:
|
|
; DS:ESI preserved
|
|
; ES:EDI updated
|
|
; ES:EBX preserved
|
|
|
|
MOVE_DEVMODE macro foo
|
|
local exit, empty_fields
|
|
|
|
mov ax,[si].otd16&foo&Size
|
|
or ax,ax
|
|
jz empty_fields
|
|
|
|
push si ;save original source
|
|
push ebx ;base pointer
|
|
|
|
add si,[si].otd16&foo&Offset
|
|
add si,size OLETARGETDEVICE16
|
|
|
|
mov eax,edi ;current offset
|
|
sub eax,ebx ;offset from base
|
|
sub eax,size OLETARGETDEVICE32 ;offsets start from end
|
|
mov es:[ebx].otd32&foo&Offset,eax ;store new offset
|
|
|
|
REPACK_DEVMODE_16_32
|
|
|
|
pop ebx ;restore base pointer
|
|
pop si
|
|
|
|
mov eax,edi
|
|
sub eax,es:[ebx].otd32&foo&Offset
|
|
mov es:[ebx].otd32&foo&Size,eax ;store new size
|
|
jmp short exit
|
|
|
|
empty_fields:
|
|
sub eax,eax
|
|
mov es:[ebx].otd32&foo&Offset,eax ;store null offset
|
|
mov es:[ebx].otd32&foo&Size,eax ;store null size
|
|
|
|
exit:
|
|
endm
|
|
|
|
mov ebx,edi
|
|
add edi,size OLETARGETDEVICE32 ;put first string here
|
|
|
|
MOVE_STRING DeviceName
|
|
MOVE_STRING DriverName
|
|
MOVE_STRING PortName
|
|
MOVE_DEVMODE ExtDevmode
|
|
MOVE_DEVMODE Environment
|
|
|
|
purge MOVE_STRING
|
|
purge MOVE_DEVMODE
|
|
endm
|
|
|