diff --git a/reactos/include/reactos/win32k/callout.h b/reactos/include/reactos/win32k/callout.h index b7c05bb22a6..edd889a3370 100644 --- a/reactos/include/reactos/win32k/callout.h +++ b/reactos/include/reactos/win32k/callout.h @@ -10,7 +10,7 @@ typedef struct _W32_CALLOUT_DATA OB_OPEN_METHOD DesktopOpen; OB_DELETE_METHOD DesktopDelete; OB_DELETE_METHOD WinStaDelete; - OB_ROS_PARSE_METHOD WinStaParse; + OB_PARSE_METHOD WinStaParse; OB_OPEN_METHOD WinStaOpen; OB_ROS_FIND_METHOD WinStaFind; OB_ROS_CREATE_METHOD DesktopCreate; diff --git a/reactos/ntoskrnl/cm/cm.h b/reactos/ntoskrnl/cm/cm.h index 9d07c6c3bef..56ccd064111 100644 --- a/reactos/ntoskrnl/cm/cm.h +++ b/reactos/ntoskrnl/cm/cm.h @@ -439,10 +439,15 @@ CmUnRegisterCallback(IN LARGE_INTEGER Cookie); NTSTATUS STDCALL CmiObjectParse(IN PVOID ParsedObject, - OUT PVOID *NextObject, - IN PUNICODE_STRING FullPath, - IN OUT PWSTR *Path, - IN ULONG Attribute); + IN PVOID ObjectType, + IN OUT PACCESS_STATE AccessState, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Attributes, + IN OUT PUNICODE_STRING FullPath, + IN OUT PUNICODE_STRING RemainingName, + IN OUT PVOID Context OPTIONAL, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, + OUT PVOID *NextObject); VOID STDCALL CmiObjectDelete(PVOID DeletedObject); diff --git a/reactos/ntoskrnl/cm/registry.c b/reactos/ntoskrnl/cm/registry.c index 1ddc7592535..59cdd5d646b 100644 --- a/reactos/ntoskrnl/cm/registry.c +++ b/reactos/ntoskrnl/cm/registry.c @@ -369,7 +369,7 @@ CmInitializeRegistry(VOID) ObjectTypeInitializer.ValidAccessMask = KEY_ALL_ACCESS; ObjectTypeInitializer.UseDefaultObject = TRUE; ObjectTypeInitializer.DeleteProcedure = CmiObjectDelete; - ObjectTypeInitializer.ParseProcedure = (PVOID)CmiObjectParse; + ObjectTypeInitializer.ParseProcedure = CmiObjectParse; ObjectTypeInitializer.SecurityProcedure = CmiObjectSecurity; ObjectTypeInitializer.QueryNameProcedure = CmiObjectQueryName; diff --git a/reactos/ntoskrnl/cm/regobj.c b/reactos/ntoskrnl/cm/regobj.c index 54192a8d050..88a2fd9f14c 100644 --- a/reactos/ntoskrnl/cm/regobj.c +++ b/reactos/ntoskrnl/cm/regobj.c @@ -24,12 +24,18 @@ CmiGetLinkTarget(PREGISTRY_HIVE RegistryHive, /* FUNCTONS *****************************************************************/ + NTSTATUS STDCALL -CmiObjectParse(PVOID ParsedObject, - PVOID *NextObject, - PUNICODE_STRING FullPath, - PWSTR *Path, - ULONG Attributes) +CmiObjectParse(IN PVOID ParsedObject, + IN PVOID ObjectType, + IN OUT PACCESS_STATE AccessState, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Attributes, + IN OUT PUNICODE_STRING FullPath, + IN OUT PUNICODE_STRING RemainingName, + IN OUT PVOID Context OPTIONAL, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, + OUT PVOID *NextObject) { BLOCK_OFFSET BlockOffset; PKEY_OBJECT FoundObject; @@ -42,6 +48,7 @@ CmiObjectParse(PVOID ParsedObject, UNICODE_STRING LinkPath; UNICODE_STRING TargetPath; UNICODE_STRING KeyName; + PWSTR *Path = &RemainingName->Buffer; ParsedKey = ParsedObject; diff --git a/reactos/ntoskrnl/ex/win32k.c b/reactos/ntoskrnl/ex/win32k.c index 119cbdb1d56..73940e7b8a1 100644 --- a/reactos/ntoskrnl/ex/win32k.c +++ b/reactos/ntoskrnl/ex/win32k.c @@ -36,7 +36,7 @@ static GENERIC_MAPPING ExpDesktopMapping = }; OB_OPEN_METHOD ExpWindowStationObjectOpen = NULL; -OB_ROS_PARSE_METHOD ExpWindowStationObjectParse = NULL; +OB_PARSE_METHOD ExpWindowStationObjectParse = NULL; OB_DELETE_METHOD ExpWindowStationObjectDelete = NULL; OB_ROS_FIND_METHOD ExpWindowStationObjectFind = NULL; OB_ROS_CREATE_METHOD ExpDesktopObjectCreate = NULL; @@ -82,20 +82,28 @@ ExpWinStaObjectFind(PVOID WinStaObject, NTSTATUS STDCALL -ExpWinStaObjectParse(PVOID Object, - PVOID *NextObject, - PUNICODE_STRING FullPath, - PWSTR *Path, - ULONG Attributes, - POBP_LOOKUP_CONTEXT Context) +ExpWinStaObjectParse(IN PVOID ParseObject, + IN PVOID ObjectType, + IN OUT PACCESS_STATE AccessState, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Attributes, + IN OUT PUNICODE_STRING CompleteName, + IN OUT PUNICODE_STRING RemainingName, + IN OUT PVOID Context OPTIONAL, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, + OUT PVOID *Object) { /* Call the Registered Callback */ - return ExpWindowStationObjectParse(Object, - NextObject, - FullPath, - Path, + return ExpWindowStationObjectParse(ParseObject, + ObjectType, + AccessState, + AccessMode, Attributes, - Context); + CompleteName, + RemainingName, + Context, + SecurityQos, + Object); } NTSTATUS diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index 703d81fbba1..51fd332ef04 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -60,16 +60,6 @@ typedef PVOID ULONG Attributes ); -typedef NTSTATUS -(NTAPI *OB_ROS_PARSE_METHOD)( - PVOID Object, - PVOID *NextObject, - PUNICODE_STRING FullPath, - PWSTR *Path, - ULONG Attributes, - POBP_LOOKUP_CONTEXT Context -); - BOOLEAN NTAPI ObpDeleteEntryDirectory(POBP_LOOKUP_CONTEXT Context); diff --git a/reactos/ntoskrnl/ob/obname.c b/reactos/ntoskrnl/ob/obname.c index a0e8601d5ef..04af96aafd8 100644 --- a/reactos/ntoskrnl/ob/obname.c +++ b/reactos/ntoskrnl/ob/obname.c @@ -37,6 +37,7 @@ ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo, PWSTR current; UNICODE_STRING PathString; ULONG Attributes; + UNICODE_STRING CurrentUs; PAGED_CODE(); @@ -169,12 +170,19 @@ Next: DPRINT("Current object can't parse\n"); break; } - Status = ((OB_ROS_PARSE_METHOD)CurrentHeader->Type->TypeInfo.ParseProcedure)(CurrentObject, - &NextObject, - &PathString, - ¤t, + + RtlInitUnicodeString(&CurrentUs, current); + Status = CurrentHeader->Type->TypeInfo.ParseProcedure(CurrentObject, + CurrentHeader->Type, + NULL, + ExGetPreviousMode(), Attributes, - Context); + &PathString, + &CurrentUs, + NULL, + NULL, + &NextObject); + current = CurrentUs.Buffer; if (Status == STATUS_REPARSE) { /* reparse the object path */ diff --git a/reactos/ntoskrnl/ob/symlink.c b/reactos/ntoskrnl/ob/symlink.c index 974fecf439b..b57b8304091 100644 --- a/reactos/ntoskrnl/ob/symlink.c +++ b/reactos/ntoskrnl/ob/symlink.c @@ -86,16 +86,22 @@ ObpDeleteSymbolicLink(PVOID ObjectBody) *--*/ NTSTATUS NTAPI -ObpParseSymbolicLink(PVOID Object, - PVOID * NextObject, - PUNICODE_STRING FullPath, - PWSTR * RemainingPath, - ULONG Attributes) +ObpParseSymbolicLink(IN PVOID ParsedObject, + IN PVOID ObjectType, + IN OUT PACCESS_STATE AccessState, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Attributes, + IN OUT PUNICODE_STRING FullPath, + IN OUT PUNICODE_STRING RemainingName, + IN OUT PVOID Context OPTIONAL, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, + OUT PVOID *NextObject) { - POBJECT_SYMBOLIC_LINK SymlinkObject = (POBJECT_SYMBOLIC_LINK)Object; + POBJECT_SYMBOLIC_LINK SymlinkObject = (POBJECT_SYMBOLIC_LINK)ParsedObject; PUNICODE_STRING TargetPath; PWSTR NewTargetPath; ULONG LengthUsed, MaximumLength, RemainLength; + PWSTR *RemainingPath = &RemainingName->Buffer; /* * Stop parsing if the entire path has been parsed and @@ -186,7 +192,7 @@ ObInitSymbolicLinkImplementation(VOID) ObjectTypeInitializer.PoolType = NonPagedPool; ObjectTypeInitializer.ValidAccessMask = SYMBOLIC_LINK_ALL_ACCESS; ObjectTypeInitializer.UseDefaultObject = TRUE; - ObjectTypeInitializer.ParseProcedure = (OB_PARSE_METHOD)ObpParseSymbolicLink; + ObjectTypeInitializer.ParseProcedure = ObpParseSymbolicLink; ObjectTypeInitializer.DeleteProcedure = ObpDeleteSymbolicLink; ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ObSymbolicLinkType); } diff --git a/reactos/ntoskrnl/ps/win32.c b/reactos/ntoskrnl/ps/win32.c index a80b378d6cc..fe6e56b3bce 100644 --- a/reactos/ntoskrnl/ps/win32.c +++ b/reactos/ntoskrnl/ps/win32.c @@ -21,7 +21,7 @@ static PKWIN32_PROCESS_CALLOUT PspWin32ProcessCallback = NULL; static PKWIN32_THREAD_CALLOUT PspWin32ThreadCallback = NULL; extern OB_OPEN_METHOD ExpWindowStationObjectOpen; -extern OB_ROS_PARSE_METHOD ExpWindowStationObjectParse; +extern OB_PARSE_METHOD ExpWindowStationObjectParse; extern OB_DELETE_METHOD ExpWindowStationObjectDelete; extern OB_ROS_FIND_METHOD ExpWindowStationObjectFind; extern OB_ROS_CREATE_METHOD ExpDesktopObjectCreate; diff --git a/reactos/subsystems/win32/win32k/include/winsta.h b/reactos/subsystems/win32/win32k/include/winsta.h index aa73a538072..ad8c6a095db 100644 --- a/reactos/subsystems/win32/win32k/include/winsta.h +++ b/reactos/subsystems/win32/win32k/include/winsta.h @@ -70,12 +70,16 @@ IntWinStaObjectFind(PVOID Object, NTSTATUS STDCALL -IntWinStaObjectParse(PVOID Object, - PVOID *NextObject, - PUNICODE_STRING FullPath, - PWSTR *Path, - ULONG Attributes, - PVOID Context); +IntWinStaObjectParse(IN PVOID ParseObject, + IN PVOID ObjectType, + IN OUT PACCESS_STATE AccessState, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Attributes, + IN OUT PUNICODE_STRING CompleteName, + IN OUT PUNICODE_STRING RemainingName, + IN OUT PVOID Context OPTIONAL, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, + OUT PVOID *Object); NTSTATUS FASTCALL IntValidateWindowStationHandle( diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index e8fdaaf2106..415ddec685e 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -382,7 +382,7 @@ DriverEntry ( * Register Object Manager Callbacks */ CalloutData.WinStaOpen = IntWinStaObjectOpen; - CalloutData.WinStaParse = (OB_ROS_PARSE_METHOD)IntWinStaObjectParse; + CalloutData.WinStaParse = IntWinStaObjectParse; CalloutData.WinStaDelete = IntWinStaObjectDelete; CalloutData.WinStaFind = IntWinStaObjectFind; CalloutData.DesktopCreate = IntDesktopObjectCreate; diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index 52084e38c38..bc724e95855 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -186,13 +186,18 @@ IntWinStaObjectFind(PVOID Object, NTSTATUS STDCALL -IntWinStaObjectParse(PVOID Object, - PVOID *NextObject, - PUNICODE_STRING FullPath, - PWSTR *Path, - ULONG Attributes, - PVOID Context) +IntWinStaObjectParse(IN PVOID Object, + IN PVOID ObjectType, + IN OUT PACCESS_STATE AccessState, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Attributes, + IN OUT PUNICODE_STRING FullPath, + IN OUT PUNICODE_STRING RemainingName, + IN OUT PVOID Context OPTIONAL, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, + OUT PVOID *NextObject) { + PWSTR *Path = &RemainingName->Buffer; PVOID FoundObject; NTSTATUS Status; PWSTR End;