📄 gdientry.c
字号:
}
/* Clear the incoming pointer */
RtlZeroMemory(pHalInfo, sizeof(DDHALINFO));
/* Convert all the data */
pHalInfo->dwSize = sizeof(DDHALINFO);
pHalInfo->lpDDCallbacks = pDDCallbacks;
pHalInfo->lpDDSurfaceCallbacks = pDDSurfaceCallbacks;
pHalInfo->lpDDPaletteCallbacks = pDDPaletteCallbacks;
/* Check for NT5+ D3D Data */
if (D3dCallbacks.dwSize && D3dDriverData.dwSize)
{
/* Write these down */
pHalInfo->lpD3DGlobalDriverData = (ULONG_PTR)pD3dDriverData;
pHalInfo->lpD3DHALCallbacks = (ULONG_PTR)pD3dCallbacks;
/* Check for Buffer Callbacks */
if (D3dBufferCallbacks.dwSize)
{
/* Write this one too */
pHalInfo->lpDDExeBufCallbacks = pD3dBufferCallbacks;
}
}
/* Continue converting the rest */
pHalInfo->vmiData.dwFlags = HalInfo.vmiData.dwFlags;
pHalInfo->vmiData.dwDisplayWidth = HalInfo.vmiData.dwDisplayWidth;
pHalInfo->vmiData.dwDisplayHeight = HalInfo.vmiData.dwDisplayHeight;
pHalInfo->vmiData.lDisplayPitch = HalInfo.vmiData.lDisplayPitch;
pHalInfo->vmiData.fpPrimary = 0;
pHalInfo->vmiData.ddpfDisplay = HalInfo.vmiData.ddpfDisplay;
pHalInfo->vmiData.dwOffscreenAlign = HalInfo.vmiData.dwOffscreenAlign;
pHalInfo->vmiData.dwOverlayAlign = HalInfo.vmiData.dwOverlayAlign;
pHalInfo->vmiData.dwTextureAlign = HalInfo.vmiData.dwTextureAlign;
pHalInfo->vmiData.dwZBufferAlign = HalInfo.vmiData.dwZBufferAlign;
pHalInfo->vmiData.dwAlphaAlign = HalInfo.vmiData.dwAlphaAlign;
pHalInfo->vmiData.dwNumHeaps = dwNumHeaps;
pHalInfo->vmiData.pvmList = pvmList;
// pHalInfo->ddCaps = HalInfo.ddCaps;
// pHalInfo->ddCaps.dwNumFourCCCodes = FourCCs;
pHalInfo->lpdwFourCC = pdwFourCC;
pHalInfo->ddCaps.dwRops[6] = 0x1000;
pHalInfo->dwFlags = HalInfo.dwFlags | DDHALINFO_GETDRIVERINFOSET;
// pHalInfo->GetDriverInfo = DdGetDriverInfo;
/* Now check if we got any DD callbacks */
if (pDDCallbacks)
{
/* Zero the structure */
RtlZeroMemory(pDDCallbacks, sizeof(DDHAL_DDCALLBACKS));
/* Set the flags for this structure */
Flags = CallbackFlags[0];
/* Write the header */
pDDCallbacks->dwSize = sizeof(DDHAL_DDCALLBACKS);
pDDCallbacks->dwFlags = Flags;
/* Now write the pointers, if applicable */
if (Flags & DDHAL_CB32_CREATESURFACE)
{
pDDCallbacks->CreateSurface = DdCreateSurface;
}
if (Flags & DDHAL_CB32_WAITFORVERTICALBLANK)
{
pDDCallbacks->WaitForVerticalBlank = DdWaitForVerticalBlank;
}
if (Flags & DDHAL_CB32_CANCREATESURFACE)
{
pDDCallbacks->CanCreateSurface = DdCanCreateSurface;
}
if (Flags & DDHAL_CB32_GETSCANLINE)
{
pDDCallbacks->GetScanLine = DdGetScanLine;
}
}
/* Check for DD Surface Callbacks */
if (pDDSurfaceCallbacks)
{
/* Zero the structures */
RtlZeroMemory(pDDSurfaceCallbacks, sizeof(DDHAL_DDSURFACECALLBACKS));
/* Set the flags for this one */
Flags = CallbackFlags[1];
/* Write the header, note that some functions are always exposed */
pDDSurfaceCallbacks->dwSize = sizeof(DDHAL_DDSURFACECALLBACKS);
pDDSurfaceCallbacks->dwFlags = Flags;
/*
pDDSurfaceCallBacks->dwFlags = (DDHAL_SURFCB32_LOCK |
DDHAL_SURFCB32_UNLOCK |
DDHAL_SURFCB32_SETCOLORKEY |
DDHAL_SURFCB32_DESTROYSURFACE) | Flags;
*/
/* Write the always-on functions */
pDDSurfaceCallbacks->Lock = DdLock;
pDDSurfaceCallbacks->Unlock = DdUnlock;
pDDSurfaceCallbacks->SetColorKey = DdSetColorKey;
pDDSurfaceCallbacks->DestroySurface = DdDestroySurface;
/* Write the optional ones */
if (Flags & DDHAL_SURFCB32_FLIP)
{
pDDSurfaceCallbacks->Flip = DdFlip;
}
if (Flags & DDHAL_SURFCB32_BLT)
{
pDDSurfaceCallbacks->Blt = DdBlt;
}
if (Flags & DDHAL_SURFCB32_GETBLTSTATUS)
{
pDDSurfaceCallbacks->GetBltStatus = DdGetBltStatus;
}
if (Flags & DDHAL_SURFCB32_GETFLIPSTATUS)
{
pDDSurfaceCallbacks->GetFlipStatus = DdGetFlipStatus;
}
if (Flags & DDHAL_SURFCB32_UPDATEOVERLAY)
{
pDDSurfaceCallbacks->UpdateOverlay = DdUpdateOverlay;
}
if (Flags & DDHAL_SURFCB32_SETOVERLAYPOSITION)
{
pDDSurfaceCallbacks->SetOverlayPosition = DdSetOverlayPosition;
}
if (Flags & DDHAL_SURFCB32_ADDATTACHEDSURFACE)
{
pDDSurfaceCallbacks->AddAttachedSurface = DdAddAttachedSurface;
}
}
/* Check for DD Palette Callbacks */
if (pDDPaletteCallbacks)
{
/* Zero the struct */
RtlZeroMemory(pDDPaletteCallbacks, sizeof(DDHAL_DDPALETTECALLBACKS));
/* Get the flags for this one */
Flags = CallbackFlags[2];
/* Write the header */
pDDPaletteCallbacks->dwSize = sizeof(DDHAL_DDPALETTECALLBACKS);
pDDPaletteCallbacks->dwFlags = Flags;
}
/* Check for D3D Callbacks */
if (pD3dCallbacks)
{
/* Zero the struct */
RtlZeroMemory(pD3dCallbacks, sizeof(D3DHAL_CALLBACKS));
/* Check if we have one */
if (D3dCallbacks.dwSize)
{
/* Write the header */
pD3dCallbacks->dwSize = sizeof(D3DHAL_CALLBACKS);
/* Now check for each callback */
if (D3dCallbacks.ContextCreate)
{
/* FIXME
pD3dCallbacks->ContextCreate = D3dContextCreate;
*/
}
if (D3dCallbacks.ContextDestroy)
{
pD3dCallbacks->ContextDestroy = (LPD3DHAL_CONTEXTDESTROYCB) NtGdiD3dContextDestroy;
}
if (D3dCallbacks.ContextDestroyAll)
{
/* FIXME
pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB) NtGdiD3dContextDestroyAll;
*/
}
}
}
/* Check for D3D Driver Data */
if (pD3dDriverData)
{
/* Copy the struct */
RtlMoveMemory(pD3dDriverData,
&D3dDriverData,
sizeof(D3DHAL_GLOBALDRIVERDATA));
/* Write the pointer to the texture formats */
pD3dDriverData->lpTextureFormats = pD3dTextureFormats;
}
/* FIXME: Check for D3D Buffer Callbacks */
/* Check if we have a video memory list */
if (VidMemList)
{
/* Start a loop here */
PVIDEOMEMORY VidMem = VidMemList;
/* Loop all the heaps we have */
while (dwNumHeaps--)
{
/* Copy from one format to the other */
pvmList->dwFlags = VidMem->dwFlags;
pvmList->fpStart = VidMem->fpStart;
pvmList->fpEnd = VidMem->fpEnd;
pvmList->ddsCaps = VidMem->ddsCaps;
pvmList->ddsCapsAlt = VidMem->ddsCapsAlt;
pvmList->dwHeight = VidMem->dwHeight;
/* Advance in both structures */
pvmList++;
VidMem++;
}
/* Free our structure */
LocalFree(VidMemList);
}
return TRUE;
}
/*
* @implemented
*
* GDIEntry 3
*/
BOOL
WINAPI
DdDeleteDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal)
{
BOOL Return = FALSE;
/* If this is the global object */
if(pDirectDrawGlobal->hDD)
{
/* Free it */
Return = NtGdiDdDeleteDirectDrawObject((HANDLE)pDirectDrawGlobal->hDD);
if (Return == TRUE)
{
pDirectDrawGlobal->hDD = 0;
}
}
else if (ghDirectDraw)
{
/* Always success here */
Return = TRUE;
/* Make sure this is the last instance */
if (!(--gcDirectDraw))
{
/* Delete the object */
Return = NtGdiDdDeleteDirectDrawObject(ghDirectDraw);
if (Return == TRUE)
{
ghDirectDraw = 0;
}
}
}
/* Return */
return Return;
}
/*
* @implemented
*
* GDIEntry 4
*/
BOOL
WINAPI
DdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal,
BOOL bPrimarySurface)
{
return bDDCreateSurface(pSurfaceLocal, TRUE);
//return bDdCreateSurfaceObject(pSurfaceLocal, TRUE);
}
/*
* @implemented
*
* GDIEntry 5
*/
BOOL
WINAPI
DdDeleteSurfaceObject(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal)
{
BOOL Return = FALSE;
/* Make sure there is one */
if (pSurfaceLocal->hDDSurface)
{
/* Delete it */
Return = NtGdiDdDeleteSurfaceObject((HANDLE)pSurfaceLocal->hDDSurface);
pSurfaceLocal->hDDSurface = 0;
}
return Return;
}
/*
* @implemented
*
* GDIEntry 6
*/
BOOL
WINAPI
DdResetVisrgn(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal,
HWND hWnd)
{
/* Call win32k directly */
return NtGdiDdResetVisrgn((HANDLE) pSurfaceLocal->hDDSurface, hWnd);
}
/*
* @implemented
*
* GDIEntry 7
*/
HDC
WINAPI
DdGetDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal,
LPPALETTEENTRY pColorTable)
{
/* Call win32k directly */
return NtGdiDdGetDC(pColorTable, (HANDLE) pSurfaceLocal->hDDSurface);
}
/*
* @implemented
*
* GDIEntry 8
*/
BOOL
WINAPI
DdReleaseDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal)
{
/* Call win32k directly */
return NtGdiDdReleaseDC((HANDLE) pSurfaceLocal->hDDSurface);
}
/*
* @unimplemented
* GDIEntry 9
*/
HBITMAP
STDCALL
DdCreateDIBSection(HDC hdc,
CONST BITMAPINFO *pbmi,
UINT iUsage,
VOID **ppvBits,
HANDLE hSectionApp,
DWORD dwOffset)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/*
* @implemented
*
* GDIEntry 10
*/
BOOL
WINAPI
DdReenableDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal,
BOOL *pbNewMode)
{
/* Call win32k directly */
return NtGdiDdReenableDirectDrawObject(GetDdHandle(pDirectDrawGlobal->hDD),
pbNewMode);
}
/*
* @implemented
*
* GDIEntry 11
*/
BOOL
STDCALL
DdAttachSurface( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom,
LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo)
{
/* Create Surface if it does not exits one */
if (pSurfaceFrom->hDDSurface)
{
if (!bDDCreateSurface(pSurfaceFrom, FALSE))
{
return FALSE;
}
}
/* Create Surface if it does not exits one */
if (pSurfaceTo->hDDSurface)
{
if (!bDDCreateSurface(pSurfaceTo, FALSE))
{
return FALSE;
}
}
/* Call win32k */
return NtGdiDdAttachSurface((HANDLE)pSurfaceFrom->hDDSurface,
(HANDLE)pSurfaceTo->hDDSurface);
}
/*
* @implemented
*
* GDIEntry 12
*/
VOID
STDCALL
DdUnattachSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface,
LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached)
{
/* Call win32k */
NtGdiDdUnattachSurface((HANDLE)pSurface->hDDSurface,
(HANDLE)pSurfaceAttached->hDDSurface);
}
/*
* @implemented
*
* GDIEntry 13
*/
ULONG
STDCALL
DdQueryDisplaySettingsUniqueness()
{
return RemberDdQueryDisplaySettingsUniquenessID;
}
/*
* @implemented
*
* GDIEntry 14
*/
HANDLE
WINAPI
DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw,
LPDDRAWI_DDRAWSURFACE_LCL pSurface,
BOOL bRelease)
{
HANDLE hDD = NULL;
HANDLE hSurface = (HANDLE)pSurface->hDDSurface;
/* Check if we already have a surface */
if (!pSurface)
{
/* We don't have one, use the DirectDraw Object handle instead */
hSurface = NULL;
hDD = GetDdHandle(pDDraw->lpGbl->hDD);
}
/* Call the API */
return (HANDLE)NtGdiDdGetDxHandle(hDD, hSurface, bRelease);
}
/*
* @implemented
*
* GDIEntry 15
*/
BOOL
WINAPI
DdSetGammaRamp(LPDDRAWI_DIRECTDRAW_LCL pDDraw,
HDC hdc,
LPVOID lpGammaRamp)
{
/* Call win32k directly */
return NtGdiDdSetGammaRamp(GetDdHandle(pDDraw->lpGbl->hDD),
hdc,
lpGammaRamp);
}
/*
* @implemented
*
* GDIEntry 16
*/
DWORD
WINAPI
DdSwapTextureHandles(LPDDRAWI_DIRECTDRAW_LCL pDDraw,
LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl1,
LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl2)
{
/* Always returns success */
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -