mirror of
https://github.com/reactos/reactos.git
synced 2025-04-19 12:08:55 +00:00
Fixes for NDK compatibily (and plain ol' good design): - Use correct LDRP_ flags instead of our own made up ones. - Remove extra Process Info Classes that aren't in winddk, and use an add-on enumeration in the NDK. - Make ntoskrnl even more unaware of Win32K Internals by removing the deprecated PsCreateWin32Process function, moving w32process/thread allocation to win32k, and fixing the PsEstablishWin32Callouts function to use the latest NT prototype and callout data. These changes are similar to the ones done in NT.
svn path=/trunk/; revision=16290
This commit is contained in:
parent
7c91ae9295
commit
fef9d4dc69
13 changed files with 160 additions and 156 deletions
|
@ -251,13 +251,38 @@ typedef struct _HARDWARE_PTE_X86
|
|||
ULONG PageFrameNumber : 20;
|
||||
} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;
|
||||
|
||||
typedef struct _DESCRIPTOR
|
||||
{
|
||||
WORD Pad;
|
||||
WORD Limit;
|
||||
DWORD Base;
|
||||
} KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
|
||||
typedef struct _KSPECIAL_REGISTERS
|
||||
{
|
||||
DWORD Cr0;
|
||||
DWORD Cr2;
|
||||
DWORD Cr3;
|
||||
DWORD Cr4;
|
||||
DWORD KernelDr0;
|
||||
DWORD KernelDr1;
|
||||
DWORD KernelDr2;
|
||||
DWORD KernelDr3;
|
||||
DWORD KernelDr6;
|
||||
DWORD KernelDr7;
|
||||
KDESCRIPTOR Gdtr;
|
||||
KDESCRIPTOR Idtr;
|
||||
WORD Tr;
|
||||
WORD Ldtr;
|
||||
DWORD Reserved[6];
|
||||
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
||||
|
||||
#pragma pack(push,4)
|
||||
|
||||
/* Fixme: Use correct types? */
|
||||
typedef struct _KPROCESSOR_STATE
|
||||
{
|
||||
PCONTEXT ContextFrame;
|
||||
PVOID SpecialRegisters;
|
||||
KSPECIAL_REGISTERS SpecialRegisters;
|
||||
} KPROCESSOR_STATE;
|
||||
|
||||
/* Processor Control Block */
|
||||
|
|
|
@ -19,19 +19,24 @@
|
|||
#define RESOURCE_LANGUAGE_LEVEL 2
|
||||
#define RESOURCE_DATA_LEVEL 3
|
||||
|
||||
/* FIXME: USE CORRRECT LDR_ FLAGS */
|
||||
#define IMAGE_DLL 0x00000004
|
||||
#define LOAD_IN_PROGRESS 0x00001000
|
||||
#define UNLOAD_IN_PROGRESS 0x00002000
|
||||
#define ENTRY_PROCESSED 0x00004000
|
||||
#define DONT_CALL_FOR_THREAD 0x00040000
|
||||
#define PROCESS_ATTACH_CALLED 0x00080000
|
||||
#define IMAGE_NOT_AT_BASE 0x00200000
|
||||
/* LDR_DATA_TABLE_ENTRY Flags */
|
||||
#define LDRP_STATIC_LINK 0x00000002
|
||||
#define LDRP_IMAGE_DLL 0x00000004
|
||||
#define LDRP_LOAD_IN_PROGRESS 0x00001000
|
||||
#define LDRP_UNLOAD_IN_PROGRESS 0x00002000
|
||||
#define LDRP_ENTRY_PROCESSED 0x00004000
|
||||
#define LDRP_ENTRY_INSERTED 0x00008000
|
||||
#define LDRP_CURRENT_LOAD 0x00010000
|
||||
#define LDRP_FAILED_BUILTIN_LOAD 0x00020000
|
||||
#define LDRP_DONT_CALL_FOR_THREADS 0x00040000
|
||||
#define LDRP_PROCESS_ATTACH_CALLED 0x00080000
|
||||
#define LDRP_DEBUG_SYMBOLS_LOADED 0x00100000
|
||||
#define LDRP_IMAGE_NOT_AT_BASE 0x00200000
|
||||
#define LDRP_WX86_IGNORE_MACHINETYPE 0x00400000
|
||||
|
||||
/* ENUMERATIONS **************************************************************/
|
||||
|
||||
/* TYPES *********************************************************************/
|
||||
/* FIXME: Update with _LDR_DATA_TABLE_ENTRY and LDR_ flags */
|
||||
typedef struct _PEB_LDR_DATA
|
||||
{
|
||||
ULONG Length;
|
||||
|
@ -54,8 +59,8 @@ typedef struct _LDR_DATA_TABLE_ENTRY
|
|||
UNICODE_STRING FullDllName;
|
||||
UNICODE_STRING BaseDllName;
|
||||
ULONG Flags;
|
||||
USHORT LoadCount; /* FIXME: HACK!!! FIX ASAP */
|
||||
USHORT TlsIndex; /* FIXME: HACK!!! FIX ASAP */
|
||||
USHORT LoadCount;
|
||||
USHORT TlsIndex;
|
||||
LIST_ENTRY HashLinks;
|
||||
PVOID SectionPointer;
|
||||
ULONG CheckSum;
|
||||
|
|
|
@ -115,17 +115,6 @@ typedef NTSTATUS
|
|||
|
||||
/* TYPES *********************************************************************/
|
||||
|
||||
/* FIXME: Does this match NT's? */
|
||||
typedef struct _W32_OBJECT_CALLBACK
|
||||
{
|
||||
OB_OPEN_METHOD WinStaCreate;
|
||||
OB_PARSE_METHOD WinStaParse;
|
||||
OB_DELETE_METHOD WinStaDelete;
|
||||
OB_FIND_METHOD WinStaFind;
|
||||
OB_CREATE_METHOD DesktopCreate;
|
||||
OB_DELETE_METHOD DesktopDelete;
|
||||
} W32_OBJECT_CALLBACK, *PW32_OBJECT_CALLBACK;
|
||||
|
||||
typedef struct _OBJECT_BASIC_INFORMATION
|
||||
{
|
||||
ULONG Attributes;
|
||||
|
|
|
@ -14,6 +14,28 @@
|
|||
|
||||
/* PROTOTYPES ****************************************************************/
|
||||
|
||||
PVOID
|
||||
STDCALL
|
||||
PsGetProcessWin32Process(PEPROCESS Process);
|
||||
|
||||
VOID
|
||||
STDCALL
|
||||
PsSetProcessWin32Process(
|
||||
PEPROCESS Process,
|
||||
PVOID Win32Process
|
||||
);
|
||||
|
||||
VOID
|
||||
STDCALL
|
||||
PsSetThreadWin32Thread(
|
||||
PETHREAD Thread,
|
||||
PVOID Win32Thread
|
||||
);
|
||||
|
||||
PVOID
|
||||
STDCALL
|
||||
PsGetThreadWin32Thread(PETHREAD Thread);
|
||||
|
||||
VOID
|
||||
STDCALL
|
||||
PsRevertThreadToSelf(
|
||||
|
@ -34,14 +56,7 @@ PsGetWin32Process(
|
|||
|
||||
VOID
|
||||
STDCALL
|
||||
PsEstablishWin32Callouts(
|
||||
PW32_PROCESS_CALLBACK W32ProcessCallback,
|
||||
PW32_THREAD_CALLBACK W32ThreadCallback,
|
||||
PW32_OBJECT_CALLBACK W32ObjectCallback,
|
||||
PVOID Param4,
|
||||
ULONG W32ThreadSize,
|
||||
ULONG W32ProcessSize
|
||||
);
|
||||
PsEstablishWin32Callouts(PW32_CALLOUT_DATA CalloutData);
|
||||
|
||||
HANDLE
|
||||
STDCALL
|
||||
|
|
|
@ -617,6 +617,29 @@ typedef struct _EJOB
|
|||
} EJOB, *PEJOB;
|
||||
#include <poppack.h>
|
||||
|
||||
typedef struct _W32_CALLOUT_DATA
|
||||
{
|
||||
PW32_PROCESS_CALLBACK W32ProcessCallout;
|
||||
PW32_THREAD_CALLBACK W32ThreadCallout;
|
||||
PVOID UserGlobalAtomTableCallout;
|
||||
PVOID UserPowerEventCallout;
|
||||
PVOID UserPowerStateCallout;
|
||||
PVOID UserJobCallout;
|
||||
PVOID NtGdiUserFlushUserBatch;
|
||||
OB_OPEN_METHOD DesktopOpen;
|
||||
PVOID DesktopUnmap;
|
||||
OB_DELETE_METHOD DesktopDelete;
|
||||
OB_OKAYTOCLOSE_METHOD WinstaOkayToClose;
|
||||
OB_DELETE_METHOD WinStaDelete;
|
||||
OB_PARSE_METHOD WinStaParse;
|
||||
OB_OPEN_METHOD WinStaOpen;
|
||||
|
||||
/* FIXME: These are ROS-ONLY and are fixed in a future local patch */
|
||||
OB_FIND_METHOD WinStaFind;
|
||||
OB_OPEN_METHOD WinStaCreate;
|
||||
OB_CREATE_METHOD DesktopCreate;
|
||||
} W32_CALLOUT_DATA, *PW32_CALLOUT_DATA;
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -95,16 +95,14 @@ typedef enum _SYSTEM_DOCK_STATE
|
|||
/*
|
||||
* Process (extra ones not defined in DDK)
|
||||
*/
|
||||
/* FIXME: Temporary hack until all KMODE stuf are NDK */
|
||||
#ifndef __WINDDK_H
|
||||
typedef enum _PROCESS_INFORMATION_FLAGS
|
||||
{
|
||||
ProcessUnknown33 = 33,
|
||||
ProcessUnknown34,
|
||||
ProcessUnknown35,
|
||||
ProcessCookie
|
||||
ProcessCookie,
|
||||
MaximumProcessInformationClass
|
||||
} PROCESS_INFORMATION_FLAGS;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System
|
||||
|
|
|
@ -366,7 +366,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
FullNtDllPath);
|
||||
RtlCreateUnicodeString (&NtModule->BaseDllName,
|
||||
L"ntdll.dll");
|
||||
NtModule->Flags = IMAGE_DLL|ENTRY_PROCESSED;
|
||||
NtModule->Flags = LDRP_IMAGE_DLL|LDRP_ENTRY_PROCESSED;
|
||||
|
||||
NtModule->LoadCount = -1; /* don't unload */
|
||||
NtModule->TlsIndex = -1;
|
||||
|
@ -415,7 +415,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
&ExeModule->BaseDllName,
|
||||
&ExeModule->FullDllName);
|
||||
|
||||
ExeModule->Flags = ENTRY_PROCESSED;
|
||||
ExeModule->Flags = LDRP_ENTRY_PROCESSED;
|
||||
ExeModule->LoadCount = -1; /* don't unload */
|
||||
ExeModule->TlsIndex = -1;
|
||||
ExeModule->SectionPointer = NULL;
|
||||
|
|
|
@ -170,7 +170,7 @@ static inline VOID LdrpTlsCallback(PLDR_DATA_TABLE_ENTRY Module, ULONG dwReason)
|
|||
|
||||
static BOOLEAN LdrpCallDllEntry(PLDR_DATA_TABLE_ENTRY Module, DWORD dwReason, PVOID lpReserved)
|
||||
{
|
||||
if (!(Module->Flags & IMAGE_DLL) ||
|
||||
if (!(Module->Flags & LDRP_IMAGE_DLL) ||
|
||||
Module->EntryPoint == 0)
|
||||
{
|
||||
return TRUE;
|
||||
|
@ -1723,7 +1723,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
|||
{
|
||||
BOOLEAN WrongForwarder;
|
||||
WrongForwarder = FALSE;
|
||||
if (ImportedModule->Flags & IMAGE_NOT_AT_BASE)
|
||||
if (ImportedModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
|
||||
{
|
||||
TRACE_LDR("%wZ has stale binding to %s\n",
|
||||
&Module->BaseDllName, ImportedName);
|
||||
|
@ -1757,7 +1757,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
|||
LdrpDecrementLoadCount(Module, FALSE);
|
||||
}
|
||||
if (ForwarderModule->TimeDateStamp != BoundForwarderRef->TimeDateStamp ||
|
||||
ForwarderModule->Flags & IMAGE_NOT_AT_BASE)
|
||||
ForwarderModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
|
||||
{
|
||||
TRACE_LDR("%wZ has stale binding to %s\n",
|
||||
&Module->BaseDllName, ForwarderName);
|
||||
|
@ -1771,7 +1771,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
|||
}
|
||||
}
|
||||
if (WrongForwarder ||
|
||||
ImportedModule->Flags & IMAGE_NOT_AT_BASE)
|
||||
ImportedModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
|
||||
{
|
||||
Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -1780,7 +1780,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
|||
return Status;
|
||||
}
|
||||
}
|
||||
else if (ImportedModule->Flags & IMAGE_NOT_AT_BASE)
|
||||
else if (ImportedModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
|
||||
{
|
||||
TRACE_LDR("Adjust imports for %s from %wZ\n",
|
||||
ImportedName, &Module->BaseDllName);
|
||||
|
@ -1938,7 +1938,7 @@ PEPFUNC LdrPEStartup (PVOID ImageBase,
|
|||
|
||||
if (ImageBase != (PVOID) NTHeaders->OptionalHeader.ImageBase)
|
||||
{
|
||||
(*Module)->Flags |= IMAGE_NOT_AT_BASE;
|
||||
(*Module)->Flags |= LDRP_IMAGE_NOT_AT_BASE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2107,11 +2107,11 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
|||
(*Module)->SectionPointer = SectionHandle;
|
||||
if (ImageBase != (PVOID) NtHeaders->OptionalHeader.ImageBase)
|
||||
{
|
||||
(*Module)->Flags |= IMAGE_NOT_AT_BASE;
|
||||
(*Module)->Flags |= LDRP_IMAGE_NOT_AT_BASE;
|
||||
}
|
||||
if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
|
||||
{
|
||||
(*Module)->Flags |= IMAGE_DLL;
|
||||
(*Module)->Flags |= LDRP_IMAGE_DLL;
|
||||
}
|
||||
/* fixup the imported calls entry points */
|
||||
Status = LdrFixupImports(SearchPath, *Module);
|
||||
|
@ -2292,7 +2292,7 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
|
|||
{
|
||||
if (Module->TlsIndex == 0xFFFF)
|
||||
{
|
||||
Module->Flags |= DONT_CALL_FOR_THREAD;
|
||||
Module->Flags |= LDRP_DONT_CALL_FOR_THREADS;
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
break;
|
||||
|
@ -2420,15 +2420,15 @@ LdrpDetachProcess(BOOLEAN UnloadAll)
|
|||
{
|
||||
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||
if (((UnloadAll && Module->LoadCount <= 0) || Module->LoadCount == 0) &&
|
||||
Module->Flags & ENTRY_PROCESSED &&
|
||||
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
||||
Module->Flags & LDRP_ENTRY_PROCESSED &&
|
||||
!(Module->Flags & LDRP_UNLOAD_IN_PROGRESS))
|
||||
{
|
||||
Module->Flags |= UNLOAD_IN_PROGRESS;
|
||||
Module->Flags |= LDRP_UNLOAD_IN_PROGRESS;
|
||||
if (Module == LdrpLastModule)
|
||||
{
|
||||
LdrpLastModule = NULL;
|
||||
}
|
||||
if (Module->Flags & PROCESS_ATTACH_CALLED)
|
||||
if (Module->Flags & LDRP_PROCESS_ATTACH_CALLED)
|
||||
{
|
||||
TRACE_LDR("Unload %wZ - Calling entry point at %x\n",
|
||||
&Module->BaseDllName, Module->EntryPoint);
|
||||
|
@ -2453,7 +2453,7 @@ LdrpDetachProcess(BOOLEAN UnloadAll)
|
|||
{
|
||||
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||
Entry = Entry->Blink;
|
||||
if (Module->Flags & UNLOAD_IN_PROGRESS &&
|
||||
if (Module->Flags & LDRP_UNLOAD_IN_PROGRESS &&
|
||||
((UnloadAll && Module->LoadCount != 0xFFFF) || Module->LoadCount == 0))
|
||||
{
|
||||
/* remove the module entry from the list */
|
||||
|
@ -2512,9 +2512,9 @@ LdrpAttachProcess(VOID)
|
|||
while (Entry != ModuleListHead)
|
||||
{
|
||||
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||
if (!(Module->Flags & (LOAD_IN_PROGRESS|UNLOAD_IN_PROGRESS|ENTRY_PROCESSED)))
|
||||
if (!(Module->Flags & (LDRP_LOAD_IN_PROGRESS|LDRP_UNLOAD_IN_PROGRESS|LDRP_ENTRY_PROCESSED)))
|
||||
{
|
||||
Module->Flags |= LOAD_IN_PROGRESS;
|
||||
Module->Flags |= LDRP_LOAD_IN_PROGRESS;
|
||||
TRACE_LDR("%wZ loaded - Calling init routine at %x for process attaching\n",
|
||||
&Module->BaseDllName, Module->EntryPoint);
|
||||
Result = LdrpCallDllEntry(Module, DLL_PROCESS_ATTACH, (PVOID)(Module->LoadCount == 0xFFFF ? 1 : 0));
|
||||
|
@ -2523,15 +2523,15 @@ LdrpAttachProcess(VOID)
|
|||
Status = STATUS_DLL_INIT_FAILED;
|
||||
break;
|
||||
}
|
||||
if (Module->Flags & IMAGE_DLL && Module->EntryPoint != 0)
|
||||
if (Module->Flags & LDRP_IMAGE_DLL && Module->EntryPoint != 0)
|
||||
{
|
||||
Module->Flags |= PROCESS_ATTACH_CALLED|ENTRY_PROCESSED;
|
||||
Module->Flags |= LDRP_PROCESS_ATTACH_CALLED|LDRP_ENTRY_PROCESSED;
|
||||
}
|
||||
else
|
||||
{
|
||||
Module->Flags |= ENTRY_PROCESSED;
|
||||
Module->Flags |= LDRP_ENTRY_PROCESSED;
|
||||
}
|
||||
Module->Flags &= ~LOAD_IN_PROGRESS;
|
||||
Module->Flags &= ~LDRP_LOAD_IN_PROGRESS;
|
||||
}
|
||||
Entry = Entry->Flink;
|
||||
}
|
||||
|
@ -2578,9 +2578,9 @@ LdrpAttachThread (VOID)
|
|||
while (Entry != ModuleListHead)
|
||||
{
|
||||
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||
if (Module->Flags & PROCESS_ATTACH_CALLED &&
|
||||
!(Module->Flags & DONT_CALL_FOR_THREAD) &&
|
||||
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
||||
if (Module->Flags & LDRP_PROCESS_ATTACH_CALLED &&
|
||||
!(Module->Flags & LDRP_DONT_CALL_FOR_THREADS) &&
|
||||
!(Module->Flags & LDRP_UNLOAD_IN_PROGRESS))
|
||||
{
|
||||
TRACE_LDR("%wZ - Calling entry point at %x for thread attaching\n",
|
||||
&Module->BaseDllName, Module->EntryPoint);
|
||||
|
@ -2623,9 +2623,9 @@ LdrShutdownThread (VOID)
|
|||
{
|
||||
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||
|
||||
if (Module->Flags & PROCESS_ATTACH_CALLED &&
|
||||
!(Module->Flags & DONT_CALL_FOR_THREAD) &&
|
||||
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
||||
if (Module->Flags & LDRP_PROCESS_ATTACH_CALLED &&
|
||||
!(Module->Flags & LDRP_DONT_CALL_FOR_THREADS) &&
|
||||
!(Module->Flags & LDRP_UNLOAD_IN_PROGRESS))
|
||||
{
|
||||
TRACE_LDR("%wZ - Calling entry point at %x for thread detaching\n",
|
||||
&Module->BaseDllName, Module->EntryPoint);
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
/*
|
||||
* Defines a descriptor as it appears in the processor tables
|
||||
*/
|
||||
typedef struct _DESCRIPTOR
|
||||
typedef struct __DESCRIPTOR
|
||||
{
|
||||
ULONG a;
|
||||
ULONG b;
|
||||
|
|
|
@ -871,11 +871,10 @@ PsChargeProcessPagedPoolQuota@8
|
|||
PsChargeProcessPoolQuota@12
|
||||
PsCreateSystemProcess@12
|
||||
PsCreateSystemThread@28
|
||||
PsCreateWin32Process@4
|
||||
PsDereferenceImpersonationToken@4=PsDereferencePrimaryToken@4
|
||||
PsDereferencePrimaryToken@4
|
||||
PsDisableImpersonation@8
|
||||
PsEstablishWin32Callouts@24
|
||||
PsEstablishWin32Callouts@4
|
||||
PsGetCurrentProcessId@0
|
||||
PsGetCurrentProcessSessionId@0
|
||||
PsGetCurrentThreadId@0
|
||||
|
|
|
@ -669,6 +669,20 @@ PsGetProcessSessionId(PEPROCESS Process)
|
|||
return (HANDLE)Process->Session;
|
||||
}
|
||||
|
||||
struct _W32THREAD*
|
||||
STDCALL
|
||||
PsGetWin32Thread(VOID)
|
||||
{
|
||||
return(PsGetCurrentThread()->Tcb.Win32Thread);
|
||||
}
|
||||
|
||||
struct _W32PROCESS*
|
||||
STDCALL
|
||||
PsGetWin32Process(VOID)
|
||||
{
|
||||
return (struct _W32PROCESS*)PsGetCurrentProcess()->Win32Process;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
|
||||
static PW32_PROCESS_CALLBACK PspWin32ProcessCallback = NULL;
|
||||
static PW32_THREAD_CALLBACK PspWin32ThreadCallback = NULL;
|
||||
static ULONG PspWin32ProcessSize = 0;
|
||||
static ULONG PspWin32ThreadSize = 0;
|
||||
|
||||
extern OB_OPEN_METHOD ExpWindowStationObjectOpen;
|
||||
extern OB_PARSE_METHOD ExpWindowStationObjectParse;
|
||||
|
@ -45,106 +43,48 @@ typedef struct _NTW32CALL_SAVED_STATE
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
struct _W32THREAD*
|
||||
STDCALL
|
||||
PsGetWin32Thread(VOID)
|
||||
{
|
||||
return(PsGetCurrentThread()->Tcb.Win32Thread);
|
||||
}
|
||||
|
||||
struct _W32PROCESS*
|
||||
STDCALL
|
||||
PsGetWin32Process(VOID)
|
||||
{
|
||||
return (struct _W32PROCESS*)PsGetCurrentProcess()->Win32Process;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL
|
||||
PsCreateWin32Process(PEPROCESS Process)
|
||||
{
|
||||
if (Process->Win32Process != NULL)
|
||||
return(STATUS_SUCCESS);
|
||||
|
||||
Process->Win32Process = ExAllocatePool(NonPagedPool,
|
||||
PspWin32ProcessSize);
|
||||
if (Process->Win32Process == NULL)
|
||||
return(STATUS_NO_MEMORY);
|
||||
|
||||
RtlZeroMemory(Process->Win32Process,
|
||||
PspWin32ProcessSize);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID STDCALL
|
||||
PsEstablishWin32Callouts (PW32_PROCESS_CALLBACK W32ProcessCallback,
|
||||
PW32_THREAD_CALLBACK W32ThreadCallback,
|
||||
PW32_OBJECT_CALLBACK W32ObjectCallback,
|
||||
PVOID Param4,
|
||||
ULONG W32ThreadSize,
|
||||
ULONG W32ProcessSize)
|
||||
VOID
|
||||
STDCALL
|
||||
PsEstablishWin32Callouts(PW32_CALLOUT_DATA CalloutData)
|
||||
{
|
||||
PspWin32ProcessCallback = W32ProcessCallback;
|
||||
PspWin32ThreadCallback = W32ThreadCallback;
|
||||
|
||||
PspWin32ProcessSize = W32ProcessSize;
|
||||
PspWin32ThreadSize = W32ThreadSize;
|
||||
|
||||
ExpWindowStationObjectOpen = W32ObjectCallback->WinStaCreate;
|
||||
ExpWindowStationObjectParse = W32ObjectCallback->WinStaParse;
|
||||
ExpWindowStationObjectDelete = W32ObjectCallback->WinStaDelete;
|
||||
ExpWindowStationObjectFind = W32ObjectCallback->WinStaFind;
|
||||
ExpDesktopObjectCreate = W32ObjectCallback->DesktopCreate;
|
||||
ExpDesktopObjectDelete = W32ObjectCallback->DesktopDelete;
|
||||
PspWin32ProcessCallback = CalloutData->W32ProcessCallout;
|
||||
PspWin32ThreadCallback = CalloutData->W32ThreadCallout;
|
||||
ExpWindowStationObjectOpen = CalloutData->WinStaCreate;
|
||||
ExpWindowStationObjectParse = CalloutData->WinStaParse;
|
||||
ExpWindowStationObjectDelete = CalloutData->WinStaDelete;
|
||||
ExpWindowStationObjectFind = CalloutData->WinStaFind;
|
||||
ExpDesktopObjectCreate = CalloutData->DesktopCreate;
|
||||
ExpDesktopObjectDelete = CalloutData->DesktopDelete;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
PsInitWin32Thread (PETHREAD Thread)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
NTSTATUS Status;
|
||||
|
||||
Process = Thread->ThreadsProcess;
|
||||
|
||||
if (Process->Win32Process == NULL)
|
||||
{
|
||||
/* FIXME - lock the process */
|
||||
Process->Win32Process = ExAllocatePool (NonPagedPool,
|
||||
PspWin32ProcessSize);
|
||||
|
||||
if (Process->Win32Process == NULL)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
RtlZeroMemory (Process->Win32Process,
|
||||
PspWin32ProcessSize);
|
||||
/* FIXME - unlock the process */
|
||||
|
||||
if (PspWin32ProcessCallback != NULL)
|
||||
{
|
||||
PspWin32ProcessCallback (Process, TRUE);
|
||||
Status = PspWin32ProcessCallback(Process, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
if (Thread->Tcb.Win32Thread == NULL)
|
||||
{
|
||||
Thread->Tcb.Win32Thread = ExAllocatePool (NonPagedPool,
|
||||
PspWin32ThreadSize);
|
||||
if (Thread->Tcb.Win32Thread == NULL)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
RtlZeroMemory (Thread->Tcb.Win32Thread,
|
||||
PspWin32ThreadSize);
|
||||
|
||||
if (PspWin32ThreadCallback != NULL)
|
||||
{
|
||||
PspWin32ThreadCallback (Thread, TRUE);
|
||||
Status = PspWin32ThreadCallback(Thread, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -4330,10 +4330,6 @@ typedef enum _PROCESSINFOCLASS {
|
|||
ProcessDebugObjectHandle,
|
||||
ProcessDebugFlags,
|
||||
ProcessHandleTracing,
|
||||
ProcessUnknown33,
|
||||
ProcessUnknown34,
|
||||
ProcessUnknown35,
|
||||
ProcessCookie,
|
||||
MaxProcessInfoClass
|
||||
} PROCESSINFOCLASS;
|
||||
|
||||
|
|
Loading…
Reference in a new issue