
Hi!
Over the last year a private team of college students cross heck my work with the Win32/Gdi32 rewrite. They ask me two months ago to release this information.
I have to apologize to some developers for this release. They want it out now.
Thanks,
James
#include <stdio.h>
//#include <windows.h>
//#include <ddk\winddi.h>
typedef long * LONG_PTR;
#define APIENTRY __stdcall
typedef LONG_PTR (APIENTRY *PFN)();
typedef struct _DRVFN {
unsigned int iFunc;
PFN pfn;
} DRVFN, *PDRVFN;
//
// Index Dx Callback Eng Functions for win32k.sys
//
#define DXENG_INDEX_DxEngIsTermSrv 1
#define DXENG_INDEX_DxEngScreenAccessCheck 2
#define DXENG_INDEX_DxEngRedrawDesktop 3
#define DXENG_INDEX_DxEngDispUniq 4
#define DXENG_INDEX_DxEngIncDispUniq 5
#define DXENG_INDEX_DxEngVisRngUniq 6
#define DXENG_INDEX_DxEngLockShareSem 7
#define DXENG_INDEX_DxEngUnlockShareSem 8
#define DXENG_INDEX_DxEngEnumerateHdev 9
#define DXENG_INDEX_DxEngLockHdev 10
#define DXENG_INDEX_DxEngUnlockHdev 11
#define DXENG_INDEX_DxEngIsHdevLockedByCurrentThread 12
#define DXENG_INDEX_DxEngReferenceHdev 13
#define DXENG_INDEX_DxEngUnreferenceHdev 14
#define DXENG_INDEX_DxEngGetDeviceGammaRamp 15
#define DXENG_INDEX_DxEngSetDeviceGammaRamp 16
#define DXENG_INDEX_DxEngSpTearDownSprites 17
#define DXENG_INDEX_DxEngSpUnTearDownSprites 18
#define DXENG_INDEX_DxEngSpSpritesVisible 19
#define DXENG_INDEX_DxEngGetHdevData 20
#define DXENG_INDEX_DxEngSetHdevData 21
#define DXENG_INDEX_DxEngCreateMemoryDC 22
#define DXENG_INDEX_DxEngGetDesktopDC 23
#define DXENG_INDEX_DxEngDeleteDC 24
#define DXENG_INDEX_DxEngCleanDC 25
#define DXENG_INDEX_DxEngSetDCOwner 26
#define DXENG_INDEX_DxEngLockDC 27
#define DXENG_INDEX_DxEngUnlockDC 28
#define DXENG_INDEX_DxEngSetDCState 29
#define DXENG_INDEX_DxEngGetDCState 30
#define DXENG_INDEX_DxEngSelectBitmap 31
#define DXENG_INDEX_DxEngSetBitmapOwner 32
#define DXENG_INDEX_DxEngDeleteSurface 33
#define DXENG_INDEX_DxEngGetSurfaceData 34
#define DXENG_INDEX_DxEngAltLockSurface 35
#define DXENG_INDEX_DxEngUploadPaletteEntryToSurface 36
#define DXENG_INDEX_DxEngMarkSurfaceAsDirectDraw 37
#define DXENG_INDEX_DxEngSelectPaletteToSurface 38
#define DXENG_INDEX_DxEngSyncPaletteTableWithDevice 39
#define DXENG_INDEX_DxEngSetPaletteState 40
#define DXENG_INDEX_DxEngGetRedirectionBitmap 41
#define DXENG_INDEX_DxEngLoadImage 42
DRVFN EngFuncs[] =
{
{0, (PFN) NULL},
{ DXENG_INDEX_DxEngIsTermSrv, (PFN) DxEngIsTermSrv},
{ DXENG_INDEX_DxEngScreenAccessCheck, (PFN) DxEngScreenAccessCheck},
{ DXENG_INDEX_DxEngRedrawDesktop, (PFN) DxEngRedrawDesktop},
{ DXENG_INDEX_DxEngDispUniq, (PFN) DxEngDispUniq},
{ DXENG_INDEX_DxEngIncDispUniq, (PFN) DxEngIncDispUniq },
{ DXENG_INDEX_DxEngVisRngUniq, (PFN) DxEngVisRngUniq}
{ DXENG_INDEX_DxEngLockShareSem, (PFN) DxEngLockShareSem}
{ DXENG_INDEX_DxEngUnlockShareSem, (PFN) DxEngUnlockShareSem}
{ DXENG_INDEX_DxEngEnumerateHdev, (PFN) DxEngEnumerateHdev}
{ DXENG_INDEX_DxEngLockHdev, (PFN) DxEngLockHdev}
{ DXENG_INDEX_DxEngUnlockHdev, (PFN) DxEngUnlockHdev}
{ DXENG_INDEX_DxEngIsHdevLockedByCurrentThread, (PFN) DxEngIsHdevLockedByCurrentThread}
{ DXENG_INDEX_DxEngReferenceHdev, (PFN) DxEngReferenceHdev}
{ DXENG_INDEX_DxEngUnreferenceHdev, (PFN) DxEngUnreferenceHdev}
{ DXENG_INDEX_DxEngGetDeviceGammaRamp, (PFN) DxEngGetDeviceGammaRamp}
{ DXENG_INDEX_DxEngSetDeviceGammaRamp, (PFN) DxEngSetDeviceGammaRamp }
{ DXENG_INDEX_DxEngSpTearDownSprites, (PFN) DxEngSpTearDownSprites}
{ DXENG_INDEX_DxEngSpUnTearDownSprites, (PFN) DxEngSpUnTearDownSprites}
{ DXENG_INDEX_DxEngSpSpritesVisible, (PFN) DxEngSpSpritesVisible}
{ DXENG_INDEX_DxEngGetHdevData, (PFN) DxEngGetHdevData}
{ DXENG_INDEX_DxEngSetHdevData, (PFN) DxEngSetHdevData}
{ DXENG_INDEX_DxEngCreateMemoryDC, (PFN) DxEngCreateMemoryDC}
{ DXENG_INDEX_DxEngGetDesktopDC, (PFN) DxEngGetDesktopDC}
{ DXENG_INDEX_DxEngDeleteDC, (PFN) DxEngDeleteDC}
{ DXENG_INDEX_DxEngCleanDC, (PFN) DxEngCleanDC}
{ DXENG_INDEX_DxEngSetDCOwner, (PFN) DxEngSetDCOwner}
{ DXENG_INDEX_DxEngLockDC, (PFN) DxEngLockDC}
{ DXENG_INDEX_DxEngUnlockDC, (PFN) DxEngUnlockDC}
{ DXENG_INDEX_DxEngSetDCState, (PFN) DxEngSetDCState}
{ DXENG_INDEX_DxEngGetDCState, (PFN) DxEngGetDCState}
{ DXENG_INDEX_DxEngSelectBitmap, (PFN) DxEngSelectBitmap}
{ DXENG_INDEX_DxEngSetBitmapOwner, (PFN) DxEngSetBitmapOwner}
{ DXENG_INDEX_DxEngDeleteSurface, (PFN) DxEngDeleteSurface}
{ DXENG_INDEX_DxEngGetSurfaceData, (PFN) DxEngGetSurfaceData}
{ DXENG_INDEX_DxEngAltLockSurface, (PFN) DxEngAltLockSurface}
{ DXENG_INDEX_DxEngUploadPaletteEntryToSurface, (PFN) DxEngUploadPaletteEntryToSurface}
{ DXENG_INDEX_DxEngMarkSurfaceAsDirectDraw, (PFN) DxEngMarkSurfaceAsDirectDraw}
{ DXENG_INDEX_DxEngSelectPaletteToSurface, (PFN) DxEngSelectPaletteToSurface}
{ DXENG_INDEX_DxEngSyncPaletteTableWithDevice, (PFN) DxEngSyncPaletteTableWithDevice}
{ DXENG_INDEX_DxEngSetPaletteState, (PFN) DxEngSetPaletteState}
{ DXENG_INDEX_DxEngGetRedirectionBitmap, (PFN) DxEngGetRedirectionBitmap}
{ DXENG_INDEX_DxEngLoadImage, (PFN) DxEngLoadImage},
};
ULONG ulCountEngFuncs = DXENG_INDEX_DxEngLoadImage + 1;
//
// Index Functions for drivers/dxg.sys
//
#define DXG_INDEX_NtGdiDxgGenericThunk 0
#define DXG_INDEX_NtGdiD3dContextCreate 1
#define DXG_INDEX_NtGdiD3dContextDestroy 2
#define DXG_INDEX_NtGdiD3dContextDestroyAll 3
#define DXG_INDEX_NtGdiD3dValidateTextureStageState 4
#define DXG_INDEX_NtGdiD3dDrawPrimitives 5
#define DXG_INDEX_NtGdiDdGetDriverState 6
#define DXG_INDEX_NtGdiDdAddAttachedSurface 7
#define DXG_INDEX_NtGdiDdAlphaBlt 8
#define DXG_INDEX_NtGdiDdAddAttachedSurface 9
#define DXG_INDEX_NtGdiDdBeginMoCompFrame 10
#define DXG_INDEX_NtGdiDdBlt 11
#define DXG_INDEX_NtGdiDdCanCreateSurface 12
#define DXG_INDEX_NtGdiDdCanCreateD3DBuffer 13
#define DXG_INDEX_NtGdiDdColorControl 14
#define DXG_INDEX_NtGdiDdCreateDirectDrawObject 15
#define DXG_INDEX_NtGdiDdCreateSurface 16
#define DXG_INDEX_NtGdiDdCanCreateD3DBuffer 17
#define DXG_INDEX_NtGdiDdCreateMoComp 18
#define DXG_INDEX_NtGdiDdCreateSurfaceObject 19
#define DXG_INDEX_NtGdiDdDeleteDirectDrawObject 20
#define DXG_INDEX_NtGdiDdDeleteSurfaceObject 21
#define DXG_INDEX_NtGdiDdDestroyMoComp 22
#define DXG_INDEX_NtGdiDdDestroySurface 23
#define DXG_INDEX_NtGdiDdDestroyD3DBuffer 24
#define DXG_INDEX_NtGdiDdEndMoCompFrame 25
#define DXG_INDEX_NtGdiDdFlip 26
#define DXG_INDEX_NtGdiDdFlipToGDISurface 27
#define DXG_INDEX_NtGdiDdGetAvailDriverMemory 28
#define DXG_INDEX_NtGdiDdGetBltStatus 29
#define DXG_INDEX_NtGdiDdGetDC 30
#define DXG_INDEX_NtGdiDdGetDriverInfo 31
#define DXG_INDEX_NtGdiDdGetDxHandle 32
#define DXG_INDEX_NtGdiDdGetFlipStatus 33
#define DXG_INDEX_NtGdiDdGetInternalMoCompInfo 34
#define DXG_INDEX_NtGdiDdGetMoCompBuffInfo 35
#define DXG_INDEX_NtGdiDdGetMoCompGuids 36
#define DXG_INDEX_NtGdiDdGetMoCompFormats 37
#define DXG_INDEX_NtGdiDdGetScanLine 38
#define DXG_INDEX_NtGdiDdLock 39
#define DXG_INDEX_NtGdiDdLockD3D 40
#define DXG_INDEX_NtGdiDdQueryDirectDrawObject 41
#define DXG_INDEX_NtGdiDdQueryMoCompStatus 42
#define DXG_INDEX_NtGdiDdReenableDirectDrawObject 43
#define DXG_INDEX_NtGdiDdReleaseDC 44
#define DXG_INDEX_NtGdiDdRenderMoComp 45
#define DXG_INDEX_NtGdiDdResetVisrgn 46
#define DXG_INDEX_NtGdiDdSetColorKey 47
#define DXG_INDEX_NtGdiDdSetExclusiveMode 48
#define DXG_INDEX_NtGdiDdSetGammaRamp 49
#define DXG_INDEX_NtGdiDdCreateSurfaceEx 50
#define DXG_INDEX_NtGdiDdSetOverlayPosition 51
#define DXG_INDEX_NtGdiDdUnattachSurface 52
#define DXG_INDEX_NtGdiDdUnlock 53
#define DXG_INDEX_NtGdiDdUnlockD3D 54
#define DXG_INDEX_NtGdiDdUpdateOverlay 55
#define DXG_INDEX_NtGdiDdWaitForVerticalBlank 56
#define DXG_INDEX_NtGdiDvpCanCreateVideoPort 57
#define DXG_INDEX_NtGdiDvpColorControl 58
#define DXG_INDEX_NtGdiDvpCreateVideoPort 59
#define DXG_INDEX_NtGdiDvpDestroyVideoPort 60
#define DXG_INDEX_NtGdiDvpFlipVideoPort 61
#define DXG_INDEX_NtGdiDvpGetVideoPortBandwidth 62
#define DXG_INDEX_NtGdiDvpGetVideoPortField 63
#define DXG_INDEX_NtGdiDvpGetVideoPortFlipStatus 64
#define DXG_INDEX_NtGdiDvpGetVideoPortInputFormats 65
#define DXG_INDEX_NtGdiDvpGetVideoPortLine 66
#define DXG_INDEX_NtGdiDvpGetVideoPortOutputFormats 67
#define DXG_INDEX_NtGdiDvpGetVideoPortConnectInfo 68
#define DXG_INDEX_NtGdiDvpGetVideoSignalStatus 69
#define DXG_INDEX_NtGdiDvpUpdateVideoPort 70
#define DXG_INDEX_NtGdiDvpWaitForVideoPortSync 71
#define DXG_INDEX_NtGdiDvpAcquireNotification 72
#define DXG_INDEX_NtGdiDvpReleaseNotification 73
#define DXG_INDEX_HeapVidMemAllocAligned 74
#define DXG_INDEX_VidMemFree 75
#define DXG_INDEX_DxDdEnableDirectDraw 76
#define DXG_INDEX_DxDdDisableDirectDraw 77
#define DXG_INDEX_IntSuspendDirectDrawandEx 78 // Used with both
#define DXG_INDEX_IntResumeDirectDraw 79
#define DXG_INDEX_DxDdDynamicModeChange 80
#define DXG_INDEX_DxDdCloseProcess 81
#define DXG_INDEX_IntGetDirectDrawBounds 82
#define DXG_INDEX_DxDdEnableDirectDrawRedirection 83 // not called from w32k
#define DXG_INDEX_EngAllocPrivateUserMem 84
#define DXG_INDEX_EngFreePrivateUserMem 85
#define DXG_INDEX_EngLockDirectDrawSurface 86
#define DXG_INDEX_EngUnlockDiectDrawSurface 87
#define DXG_INDEX_DxDdSetAccelLevel 88
#define DXG_INDEX_DxDdGetSurfaceLock 89
#define DXG_INDEX_DxDdEnumLockedSurfaceRect 90
#define DXG_INDEX_EngDxIoctl 91
// External
PDRVFN pDxFuncs;
HANDLE hDxGraphics;
ULONG DirectDrawContext;
//
// These are normal for the above index functions.
//
DWORD
APIENTRY
NtGdiD3dContextCreate(
IN HANDLE hDirectDrawLocal,
IN HANDLE hSurfColor,
IN HANDLE hSurfZ,
IN OUT D3DNTHAL_CONTEXTCREATEI *pdcci
)
{
pDxFuncs[DXG_INDEX_NtGdiD3dContextCreate].pfn();
}
BOOL
APIENTRY
NtGdiDdDeleteSurfaceObject(
IN HANDLE hSurface
)
{
pDxFuncs[DXG_INDEX_NtGdiDdDeleteSurfaceObject].pfn();
}
FLATPTR
WINAPI
HeapVidMemAllocAligned(
IN LPVIDMEM lpVidMem,
IN DWORD dwWidth,
IN DWORD dwHeight,
IN LPSURFACEALIGNMENT lpAlignment,
OUT LPLONG lpNewPitch
)
{
pDxFuncs[DXG_INDEX_HeapVidMemAllocAligned].pfn();
}
VOID
WINAPI
VidMemFree(
IN LPVMEMHEAP pvmh,
IN FLATPTR ptr
)
{
pDxFuncs[DXG_INDEX_VidMemFree].pfn();
}
//
// Exceptions to the above
//
VOID
DxDdCloseProcess( ULONG ulData )
{
if (!hDxGraphics || !pDxFuncs) return;
pDxFuncs[DXG_INDEX_IntResumeDirectDraw ].pfn();
}
VOID
IntResumeDirectDraw(
PHDEV hdev,
FLONG flFlags
)
{
flFlags = !!flFlags; // Pass only 0 or 1
return (VOID) pDxFuncs[DXG_INDEX_IntResumeDirectDraw ].pfn( hdev, flFlags );
}
VOID
IntSuspendDirectDraw(
PHDEV hdev,
FLONG flFlags
)
{
flFlags = !!flFlags;
return (VOID) pDxFuncs[DXG_INDEX_IntSuspendDirectDrawandEx].pfn( hdev, flFlags );
}
VOID
APIENTRY
IntSuspendDirectDrawEx(
PHDEV hdev,
FLONG flFlags
)
{
pDxFuncs[DXG_INDEX_IntSuspendDirectDrawandEx].pfn();
}
///////////////////////////////////////////////////////////////////////////////
//
// Next step, just like opengl in gdi32!
//
///////////////////////////////////////////////////////////////////////////////
typedef long APIENTRY (*DXDDSTARTUPDXGRAPHICS) (ULONG, PDRVENABLEDATA, ULONG, PDRVENABLEDATA, PULONG, PEPROCESS);
typedef long APIENTRY (*DXDDCLEANUPDXGRAPHICS) (VOID);
DXDDSTARTUPDXGRAPHICS dxStartupDxGraphics = NULL;
DXDDCLEANUPDXGRAPHICS dxCleanupDxGraphics = NULL;
LONG
APIENTRY
DxDdCleanupDxGraphics()
{
if(!dxCleanupDxGraphics) return 0;
dxCleanupDxGraphics();
dxStartupDxGraphics = NULL;
dxCleanupDxGraphics = NULL;
pDxFuncs = NULL;
EngUnloadImage( hDxGraphics);
hDxGraphics = NULL;
}
NTSTATUS
APIENTRY
DxDdStartupDxGraphics( ULONG ulc1,
PDRVENABLEDATA pDrved1,
ULONG ulc2,
PDRVENABLEDATA pDrved2,
PULONG DDContext,
PEPROCESS Proc)
{
DRVENABLEDATA EngDrv, DXG_API;
NTSTATUS Status = STATUS_SUCCESS;
EngDrv.iDriverVersion = WNNC_SPEC_VERSION51; //0005 0001 ?????
EngDrv.pdrvfn = &EngFuncs;
EngDrv.c = ulCountEngFuncs;
hDxGraphics = NULL;
DxApiGetVersion(); // This is the only function imported from DxApi.sys.
hDxGraphics = EngLoadImage (L"drivers\\dxg.sys");
if (hDxGraphics)
{
dxStartupDxGraphics = EngFindImageProcAddress(hDxGraphics, L"DxDdStartupDxGraphics");
dxCleanupDxGraphics = EngFindImageProcAddress(hDxGraphics, L"DxDdCleanupDxGraphics");
if ( !dxStartupDxGraphics || !dxCleanupDxGraphics)
{
EngUnloadImage( hDxGraphics);
return STATUS_PROCEDURE_NOT_FOUND;
}
Status = dxStartupDxGraphics ( sizeof(DRVENABLEDATA),
&EngDrv,
sizeof(DRVENABLEDATA),
&DXG_API,
&DirectDrawContext,
Proc );
if (!NT_SUCCESS(Status))
{
dxStartupDxGraphics = NULL;
dxCleanupDxGraphics = NULL;
EngUnloadImage( hDxGraphics);
hDxGraphics = NULL;
return Status;
}
pDxFuncs = DXG_API.pdrvfn;
return Status;
}
else
return STATUS_DLL_NOT_FOUND;
}