[DXG] Implement DxDdCreateDirectDrawObject and update DdHmgAlloc CORE-4490

svn path=/trunk/; revision=74171
This commit is contained in:
Sebastian Gasiorek 2017-03-14 23:05:49 +00:00
parent 47e72b3d01
commit 856b02d967
6 changed files with 107 additions and 24 deletions

View file

@ -24,10 +24,10 @@ typedef struct _EDD_DIRECTDRAW_LOCAL
/* 0x2C */ FLONG fl;
/* 0x30 */ struct _EDD_DIRECTDRAW_LOCAL *peDirectDrawLocal_prev; // verified to match Windows XP,
// points to the old DDLocal when new handle is created.
/* 0x34 */ PEPROCESS Process;
/* 0x34 */ ULONG unk_034;
/* 0x38 */ ULONG unk_038;
/* 0x3C */ HANDLE UniqueProcess;
/* 0x40 */ VOID *unk_040;
/* 0x40 */ PEPROCESS Process;
/* 0x44 */ VOID *unk_044;
/* 0x48 */ ULONG unk_048;
/* 0x4C */ ULONG unk_04C;

View file

@ -323,12 +323,12 @@ DdGetFreeHandle(UCHAR objType)
* Size of memory to be allocated
* @param CHAR objType
* Object type
* @param UINT objFlags
* Object flags
* @param UINT objLock
* Object lock flag
*
* @return
* Handle if object is not locked by objFlags
* Object if lock is set in objFlags
* Handle if object is not locked by objLock
* Object if lock is set in objLock
* 0 if it fails.
*
* @remarks.
@ -336,7 +336,7 @@ DdGetFreeHandle(UCHAR objType)
*--*/
HANDLE
FASTCALL
DdHmgAlloc(ULONG objSize, CHAR objType, UINT objFlags)
DdHmgAlloc(ULONG objSize, CHAR objType, BOOLEAN objLock)
{
PVOID pObject = NULL;
HANDLE DdHandle = NULL;
@ -363,16 +363,17 @@ DdHmgAlloc(ULONG objSize, CHAR objType, UINT objFlags)
pEntry->Pid = (HANDLE)(((ULONG)PsGetCurrentProcessId() & 0xFFFFFFFC) | ((ULONG)(pEntry->Pid) & 1));
if (objFlags & 1)
if (objLock)
{
InterlockedIncrement((VOID*)&pEntry->pobj->cExclusiveLock);
pEntry->pobj->Tid = KeGetCurrentThread();
pEntry->pobj->cExclusiveLock = objFlags & 1;
}
pEntry->pobj->hHmgr = DdHandle;
EngReleaseSemaphore(ghsemHmgr);
/* Return handle if object not locked */
if (!(objFlags & 1))
if (!objLock)
return DdHandle;
return (HANDLE)pEntry;

View file

@ -149,15 +149,6 @@ DxDdColorControl(
return 0;
}
DWORD
NTAPI
DxDdCreateDirectDrawObject(
PVOID p1)
{
TRACE();
return 0;
}
DWORD
NTAPI
DxDdCreateD3DBuffer(

View file

@ -22,6 +22,7 @@
#include <initguid.h>
#include <ddrawi.h>
#include <ntgdityp.h>
#include <psfuncs.h>
DEFINE_GUID(GUID_NTCallbacks, 0x6fe9ecde, 0xdf89, 0x11d1, 0x9d, 0xb0, 0x00, 0x60, 0x08, 0x27, 0x71, 0xba);
DEFINE_GUID(GUID_DDMoreCaps, 0x880baf30, 0xb030, 0x11d0, 0x8e, 0xa7, 0x00, 0x60, 0x97, 0x97, 0xea, 0x5b);
@ -52,8 +53,9 @@ typedef struct _DD_BASEOBJECT
#define CapOver_DisableOGL 0x8
#define CapOver_DisableEscapes 0x10
#define ObjType_DDLOCAL_TYPE 1
#define ObjType_DDSURFACE_TYPE 2
#define ObjType_DDCONTEXT_TYPE 3
#define ObjType_DDVIDEOPORT_TYPE 4
#define ObjType_DDMOTIONCOMP_TYPE 5
@ -171,7 +173,8 @@ typedef struct _DXENG_FUNCTIONS
NTSTATUS NTAPI DriverEntry(IN PVOID Context1, IN PVOID Context2);
NTSTATUS NTAPI GsDriverEntry(IN PVOID Context1, IN PVOID Context2);
NTSTATUS APIENTRY DxDdCleanupDxGraphics(VOID);
BOOL NTAPI DxDdEnableDirectDraw(PVOID arg1, BOOL arg2);
BOOL NTAPI DxDdEnableDirectDraw(HANDLE hDev, BOOL arg2);
DWORD NTAPI DxDdCreateDirectDrawObject(HDC hDC);
/* Global pointers */
extern ULONG gcSizeDdHmgr;
@ -198,6 +201,7 @@ BOOL FASTCALL VerifyObjectOwner(PDD_ENTRY pEntry);
BOOL FASTCALL DdHmgCreate(VOID);
BOOL FASTCALL DdHmgDestroy(VOID);
PVOID FASTCALL DdHmgLock(HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned);
HANDLE FASTCALL DdHmgAlloc(ULONG objSize, CHAR objType, BOOLEAN objLock);
#endif /* _DXG_PCH_ */

View file

@ -68,6 +68,40 @@ BOOL intDdGetDriverInfo(PEDD_DIRECTDRAW_GLOBAL peDdGl, GUID guid, PVOID callback
}
PVOID
FASTCALL
intDdCreateDirectDrawLocal(HDEV hDev)
{
PEDD_DIRECTDRAW_GLOBAL peDdGl = NULL;
PEDD_DIRECTDRAW_LOCAL peDdL = NULL;
PDD_ENTRY AllocRet;
peDdGl = (PEDD_DIRECTDRAW_GLOBAL)gpEngFuncs.DxEngGetHdevData(hDev, DxEGShDevData_eddg);
AllocRet = DdHmgAlloc(sizeof(EDD_DIRECTDRAW_LOCAL), ObjType_DDLOCAL_TYPE, TRUE);
if (!AllocRet)
return NULL;
peDdL = (PEDD_DIRECTDRAW_LOCAL)AllocRet;
/* initialize DIRECTDRAW_LOCAL */
peDdL->peDirectDrawLocal_prev = peDdGl->peDirectDrawLocalList;
peDdL->UniqueProcess = PsGetCurrentThreadProcessId();
peDdL->Process = PsGetCurrentProcess();
// link DirectDrawGlobal and DirectDrawLocal
peDdGl->peDirectDrawLocalList = peDdL;
peDdL->peDirectDrawGlobal = peDdGl;
peDdL->peDirectDrawGlobal2 = peDdGl;
gpEngFuncs.DxEngReferenceHdev(hDev);
InterlockedExchangeAdd((LONG*)&peDdL->pobj.cExclusiveLock, 0xFFFFFFFF);
return peDdL->pobj.hHmgr;
}
PDD_SURFACE_LOCAL
NTAPI
DxDdLockDirectDrawSurface(HANDLE hDdSurface)
@ -266,3 +300,56 @@ DxDdEnableDirectDraw(HANDLE hDev, BOOL arg2/*What for?*/)
return FALSE;
}
/*++
* @name DxDdCreateDirectDrawObject
* @implemented
*
* Function creates new DirectDraw object
*
* @param HDC hDC
* Device context handle
*
* @return
* Newly created DirectDraw object handle.
*
* @remarks.
* Missing all AGP stuff
*--*/
DWORD
NTAPI
DxDdCreateDirectDrawObject(
HDC hDC)
{
PDC pDC = NULL;
HDEV hDev = NULL;
DWORD retVal = 0;
pDC = gpEngFuncs.DxEngLockDC(hDC);
if (!pDC)
return 0;
// get driver hDev from DC
hDev = (HDEV)gpEngFuncs.DxEngGetDCState(hDC, 3);
if (!hDev) {
gpEngFuncs.DxEngUnlockDC(pDC);
return 0;
}
// is this primary display?
if (!gpEngFuncs.DxEngGetHdevData(hDev, DxEGShDevData_display))
{
gpEngFuncs.DxEngUnlockDC(pDC);
return 0;
}
gpEngFuncs.DxEngLockHdev(hDev);
// create object only for 8BPP and more
if (gpEngFuncs.DxEngGetHdevData(hDev, DxEGShDevData_DitherFmt) >= BMF_8BPP)
retVal = (DWORD)intDdCreateDirectDrawLocal(hDev);
gpEngFuncs.DxEngUnlockHdev(hDev);
gpEngFuncs.DxEngUnlockDC(pDC);
return retVal;
}

View file

@ -912,10 +912,10 @@ void dump_edd_directdraw_local(PEDD_DIRECTDRAW_LOCAL pEddlcl)
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->fl : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, fl), pEddlcl->fl);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->peDirectDrawLocal_prev : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, peDirectDrawLocal_prev), pEddlcl->peDirectDrawLocal_prev);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->Process : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, Process), pEddlcl->Process);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_034 : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_034), pEddlcl->unk_034);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_038 : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_038), pEddlcl->unk_038);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->UniqueProcess : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, UniqueProcess), pEddlcl->UniqueProcess);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_040 : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_040), pEddlcl->unk_040);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->Process : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, Process), pEddlcl->Process);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_044 : 0x%p\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_044), pEddlcl->unk_044);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_048 : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_048), pEddlcl->unk_048);
DPRINT1("0x%08lx PEDD_DIRECTDRAW_LOCAL->unk_04C : 0x%08lx\n",FIELD_OFFSET(EDD_DIRECTDRAW_LOCAL, unk_04C), pEddlcl->unk_04C);