windows-nt/Source/XPSP1/NT/base/mvdm/thunk/thkrp.inc
2020-09-26 16:20:57 +08:00

825 lines
24 KiB
HTML

;-------------------------------
; 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