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>dxgthk</library>
|
||||||
<library>ntoskrnl</library>
|
<library>ntoskrnl</library>
|
||||||
<file>main.c</file>
|
<file>main.c</file>
|
||||||
|
<file>ddhmg.c</file>
|
||||||
<file>eng.c</file>
|
<file>eng.c</file>
|
||||||
<file>historic.c</file>
|
<file>historic.c</file>
|
||||||
<file>dxg.rc</file>
|
<file>dxg.rc</file>
|
||||||
|
|
|
@ -31,20 +31,71 @@
|
||||||
|
|
||||||
#include "tags.h"
|
#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 */
|
/* exported functions */
|
||||||
NTSTATUS DriverEntry(IN PVOID Context1, IN PVOID Context2);
|
NTSTATUS DriverEntry(IN PVOID Context1, IN PVOID Context2);
|
||||||
NTSTATUS GsDriverEntry(IN PVOID Context1, IN PVOID Context2);
|
NTSTATUS GsDriverEntry(IN PVOID Context1, IN PVOID Context2);
|
||||||
NTSTATUS DxDdCleanupDxGraphics();
|
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 */
|
/* 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 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);
|
DWORD STDCALL DxDdIoctl(ULONG ulIoctl, PVOID pBuffer, ULONG ulBufferSize);
|
||||||
|
|
||||||
/* Internel functions */
|
/* Internel functions */
|
||||||
BOOL DdHmgCreate();
|
BOOL FASTCALL VerifyObjectOwner(PDD_ENTRY pEntry);
|
||||||
BOOL DdHmgDestroy();
|
BOOL FASTCALL DdHmgCreate();
|
||||||
|
BOOL FASTCALL DdHmgDestroy();
|
||||||
|
PVOID FASTCALL DdHmgLock( HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* define stuff */
|
/* define stuff */
|
||||||
#define drvDxEngLockDC gpEngFuncs[DXENG_INDEX_DxEngLockDC]
|
#define drvDxEngLockDC gpEngFuncs[DXENG_INDEX_DxEngLockDC]
|
||||||
|
@ -53,3 +104,4 @@ BOOL DdHmgDestroy();
|
||||||
#define drvDxEngUnlockDC gpEngFuncs[DXENG_INDEX_DxEngUnlockDC]
|
#define drvDxEngUnlockDC gpEngFuncs[DXENG_INDEX_DxEngUnlockDC]
|
||||||
#define drvDxEngUnlockHdev gpEngFuncs[DXENG_INDEX_DxEngUnlockHdev]
|
#define drvDxEngUnlockHdev gpEngFuncs[DXENG_INDEX_DxEngUnlockHdev]
|
||||||
#define drvDxEngLockHdev gpEngFuncs[DXENG_INDEX_DxEngLockHdev]
|
#define drvDxEngLockHdev gpEngFuncs[DXENG_INDEX_DxEngLockHdev]
|
||||||
|
|
||||||
|
|
|
@ -13,17 +13,11 @@
|
||||||
#include <dxg_int.h>
|
#include <dxg_int.h>
|
||||||
#include "dxg_driver.h"
|
#include "dxg_driver.h"
|
||||||
|
|
||||||
ULONG gcMaxDdHmgr = 0;
|
|
||||||
ULONG gcSizeDdHmgr = 0;
|
|
||||||
LONG gcDummyPageRefCnt = 0;
|
LONG gcDummyPageRefCnt = 0;
|
||||||
HSEMAPHORE ghsemHmgr = NULL;
|
|
||||||
HSEMAPHORE ghsemDummyPage = NULL;
|
HSEMAPHORE ghsemDummyPage = NULL;
|
||||||
VOID *gpDummyPage = NULL;
|
VOID *gpDummyPage = NULL;
|
||||||
PEPROCESS gpepSession = NULL;
|
PEPROCESS gpepSession = NULL;
|
||||||
PLARGE_INTEGER gpLockShortDelay = NULL;
|
PLARGE_INTEGER gpLockShortDelay = NULL;
|
||||||
HANDLE ghFreeDdHmgr = 0;
|
|
||||||
VOID *gpentDdHmgr = NULL;
|
|
||||||
VOID *gpentDdHmgrLast = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
PDRVFN gpEngFuncs;
|
PDRVFN gpEngFuncs;
|
||||||
|
@ -142,61 +136,10 @@ DxDdCleanupDxGraphics()
|
||||||
return 0;
|
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