Add : struct _DD_BASEOBJECT base on alex and own and jim informations

Add : struct _DD_ENTRY base on alex info
change : gpentDdHmgr and gpentDdHmgrLast to PDD_ENTRY pointer 
change : move all DdHmg releated api to own file
Implement : DdHmgLock not yet use
Implement : VerifyObjectOwner it verify how own the DD_ENTRY




svn path=/trunk/; revision=31505
This commit is contained in:
Magnus Olsen 2007-12-30 21:14:20 +00:00
parent cba6b0342c
commit 901b1c3221
4 changed files with 188 additions and 64 deletions

View file

@ -0,0 +1,128 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Native driver for dxg implementation
* FILE: drivers/directx/dxg/ddhmg.c
* PROGRAMER: Magnus olsen (magnus@greatlord.com)
* REVISION HISTORY:
* 30/12-2007 Magnus Olsen
*/
#include <dxg_int.h>
/* The DdHmgr manger stuff */
ULONG gcSizeDdHmgr = 64 * sizeof(DD_ENTRY);
PDD_ENTRY gpentDdHmgr = NULL;
ULONG gcMaxDdHmgr = 0;
PDD_ENTRY gpentDdHmgrLast = NULL;
HANDLE ghFreeDdHmgr = 0;
HSEMAPHORE ghsemHmgr = NULL;
BOOL
FASTCALL
VerifyObjectOwner(PDD_ENTRY pEntry)
{
DWORD Pid = (DWORD) PsGetCurrentProcessId() & 0xFFFFFFFC;
DWORD check = pEntry->ObjectOwner.ulObj & 0xFFFFFFFE;
return ( (check == Pid) || (!check));
}
BOOL
FASTCALL
DdHmgCreate()
{
gpentDdHmgr = EngAllocMem(FL_ZERO_MEMORY, gcSizeDdHmgr, TAG_THDD);
ghFreeDdHmgr = 0;
gcMaxDdHmgr = 1;
if (gpentDdHmgr)
{
ghsemHmgr = EngCreateSemaphore();
if (ghsemHmgr)
{
gpLockShortDelay = EngAllocMem(FL_ZERO_MEMORY | FL_NONPAGED_MEMORY, sizeof(LARGE_INTEGER), TAG_GINI);
if (gpLockShortDelay)
{
gpLockShortDelay->HighPart = -1;
return TRUE;
}
EngDeleteSemaphore(ghsemHmgr);
ghsemHmgr = NULL;
}
EngFreeMem(gpentDdHmgr);
gpentDdHmgr = NULL;
}
return FALSE;
}
BOOL
FASTCALL
DdHmgDestroy()
{
gcMaxDdHmgr = 0;
gcSizeDdHmgr = 0;
ghFreeDdHmgr = 0;
gpentDdHmgrLast = NULL;
if (gpentDdHmgr)
{
EngFreeMem(gpentDdHmgr);
gpentDdHmgr = NULL;
}
if (ghsemHmgr)
{
EngDeleteSemaphore(ghsemHmgr);
ghsemHmgr = NULL;
}
return TRUE;
}
PVOID
FASTCALL
DdHmgLock( HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned)
{
DWORD Index = (DWORD)DdHandle & 0x1FFFFF;
PDD_ENTRY pEntry = NULL;
PVOID Object = NULL;
if ( !LockOwned )
{
EngAcquireSemaphore(ghsemHmgr);
}
if ( Index < gcMaxDdHmgr )
{
pEntry = (PDD_ENTRY)((PBYTE)gpentDdHmgr + (sizeof(DD_ENTRY) * Index));
if ( VerifyObjectOwner(pEntry) )
{
if ( (pEntry->Objt == ObjectType ) &&
(pEntry->FullUnique == (((DWORD)DdHandle >> 21) & 0x7FF) ) &&
(pEntry->pobj->cExclusiveLock == 0) &&
(pEntry->pobj->Tid == PsGetCurrentThread()))
{
InterlockedIncrement(&pEntry->pobj->cExclusiveLock);
pEntry->pobj->Tid = PsGetCurrentThread();
Object = pEntry->pobj;
}
}
}
if ( !LockOwned )
{
EngDeleteSemaphore(ghsemHmgr);
}
return Object;
}

View file

@ -8,6 +8,7 @@ installbase="system32/drivers" installname="dxg.sys">
<library>dxgthk</library>
<library>ntoskrnl</library>
<file>main.c</file>
<file>ddhmg.c</file>
<file>eng.c</file>
<file>historic.c</file>
<file>dxg.rc</file>

View file

@ -31,20 +31,71 @@
#include "tags.h"
typedef struct _DD_BASEOBJECT
{
HANDLE hHmgr;
ULONG ulShareCount;
LONG cExclusiveLock;
PVOID Tid;
} DD_BASEOBJECT, *PDD_BASEOBJECT, *POBJ;
typedef struct _DD_ENTRY
{
union
{
POBJ pobj;
HANDLE hFree;
};
union
{
ULONG ulObj;
struct
{
USHORT Count;
USHORT Lock;
HANDLE Pid;
};
} ObjectOwner;
USHORT FullUnique;
UCHAR Objt;
UCHAR Flags;
PVOID pUser;
} DD_ENTRY, *PDD_ENTRY;
/* exported functions */
NTSTATUS DriverEntry(IN PVOID Context1, IN PVOID Context2);
NTSTATUS GsDriverEntry(IN PVOID Context1, IN PVOID Context2);
NTSTATUS DxDdCleanupDxGraphics();
/* Global pointers */
extern ULONG gcSizeDdHmgr;
extern PDD_ENTRY gpentDdHmgr;
extern ULONG gcMaxDdHmgr;
extern PDD_ENTRY gpentDdHmgrLast;
extern HANDLE ghFreeDdHmgr;
extern HSEMAPHORE ghsemHmgr;
extern LONG gcDummyPageRefCnt;
extern HSEMAPHORE ghsemDummyPage;
extern VOID *gpDummyPage;
extern PEPROCESS gpepSession;
extern PLARGE_INTEGER gpLockShortDelay;
/* Driver list export functions */
DWORD STDCALL DxDxgGenericThunk(ULONG_PTR ulIndex, ULONG_PTR ulHandle, SIZE_T *pdwSizeOfPtr1, PVOID pvPtr1, SIZE_T *pdwSizeOfPtr2, PVOID pvPtr2);
DWORD STDCALL DxDdIoctl(ULONG ulIoctl, PVOID pBuffer, ULONG ulBufferSize);
/* Internel functions */
BOOL DdHmgCreate();
BOOL DdHmgDestroy();
BOOL FASTCALL VerifyObjectOwner(PDD_ENTRY pEntry);
BOOL FASTCALL DdHmgCreate();
BOOL FASTCALL DdHmgDestroy();
PVOID FASTCALL DdHmgLock( HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned);
/* define stuff */
#define drvDxEngLockDC gpEngFuncs[DXENG_INDEX_DxEngLockDC]
@ -53,3 +104,4 @@ BOOL DdHmgDestroy();
#define drvDxEngUnlockDC gpEngFuncs[DXENG_INDEX_DxEngUnlockDC]
#define drvDxEngUnlockHdev gpEngFuncs[DXENG_INDEX_DxEngUnlockHdev]
#define drvDxEngLockHdev gpEngFuncs[DXENG_INDEX_DxEngLockHdev]

View file

@ -13,17 +13,11 @@
#include <dxg_int.h>
#include "dxg_driver.h"
ULONG gcMaxDdHmgr = 0;
ULONG gcSizeDdHmgr = 0;
LONG gcDummyPageRefCnt = 0;
HSEMAPHORE ghsemHmgr = NULL;
HSEMAPHORE ghsemDummyPage = NULL;
VOID *gpDummyPage = NULL;
PEPROCESS gpepSession = NULL;
PLARGE_INTEGER gpLockShortDelay = NULL;
HANDLE ghFreeDdHmgr = 0;
VOID *gpentDdHmgr = NULL;
VOID *gpentDdHmgrLast = NULL;
PDRVFN gpEngFuncs;
@ -142,61 +136,10 @@ DxDdCleanupDxGraphics()
return 0;
}
BOOL
DdHmgDestroy()
{
gcMaxDdHmgr = 0;
gcSizeDdHmgr = 0;
ghFreeDdHmgr = 0;
gpentDdHmgrLast = NULL;
if (gpentDdHmgr)
{
EngFreeMem(gpentDdHmgr);
gpentDdHmgr = NULL;
}
if (ghsemHmgr)
{
EngDeleteSemaphore(ghsemHmgr);
ghsemHmgr = NULL;
}
return TRUE;
}
BOOL
DdHmgCreate()
{
gpentDdHmgr = EngAllocMem(FL_ZERO_MEMORY, gcSizeDdHmgr, TAG_THDD);
ghFreeDdHmgr = 0;
gcMaxDdHmgr = 1;
if (gpentDdHmgr)
{
ghsemHmgr = EngCreateSemaphore();
if (ghsemHmgr)
{
gpLockShortDelay = EngAllocMem(FL_ZERO_MEMORY | FL_NONPAGED_MEMORY, sizeof(LARGE_INTEGER), TAG_GINI);
if (gpLockShortDelay)
{
gpLockShortDelay->HighPart = -1;
return TRUE;
}
EngDeleteSemaphore(ghsemHmgr);
ghsemHmgr = NULL;
}
EngFreeMem(gpentDdHmgr);
gpentDdHmgr = NULL;
}
return FALSE;
}