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:
Alex Ionescu 2005-06-26 16:06:32 +00:00
parent 7c91ae9295
commit fef9d4dc69
13 changed files with 160 additions and 156 deletions

View file

@ -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 */

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -43,7 +43,7 @@
/*
* Defines a descriptor as it appears in the processor tables
*/
typedef struct _DESCRIPTOR
typedef struct __DESCRIPTOR
{
ULONG a;
ULONG b;

View file

@ -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

View file

@ -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
*/

View file

@ -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;
}

View file

@ -4330,10 +4330,6 @@ typedef enum _PROCESSINFOCLASS {
ProcessDebugObjectHandle,
ProcessDebugFlags,
ProcessHandleTracing,
ProcessUnknown33,
ProcessUnknown34,
ProcessUnknown35,
ProcessCookie,
MaxProcessInfoClass
} PROCESSINFOCLASS;