mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
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:
parent
cba6b0342c
commit
901b1c3221
4 changed files with 188 additions and 64 deletions
128
reactos/drivers/directx/dxg/ddhmg.c
Normal file
128
reactos/drivers/directx/dxg/ddhmg.c
Normal 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;
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue