- Get rid of OB_ROS_PARSE_METHOD and use OB_PARSE_METHOD instead. Hacked the current parse methods to keep using a PWSTR, however they should be modified to use the UNICODE_STRING instead...

svn path=/trunk/; revision=22036
This commit is contained in:
Alex Ionescu 2006-05-25 01:18:31 +00:00
parent c5b6c41bf9
commit 1bb8f22330
12 changed files with 92 additions and 59 deletions

View file

@ -10,7 +10,7 @@ typedef struct _W32_CALLOUT_DATA
OB_OPEN_METHOD DesktopOpen; OB_OPEN_METHOD DesktopOpen;
OB_DELETE_METHOD DesktopDelete; OB_DELETE_METHOD DesktopDelete;
OB_DELETE_METHOD WinStaDelete; OB_DELETE_METHOD WinStaDelete;
OB_ROS_PARSE_METHOD WinStaParse; OB_PARSE_METHOD WinStaParse;
OB_OPEN_METHOD WinStaOpen; OB_OPEN_METHOD WinStaOpen;
OB_ROS_FIND_METHOD WinStaFind; OB_ROS_FIND_METHOD WinStaFind;
OB_ROS_CREATE_METHOD DesktopCreate; OB_ROS_CREATE_METHOD DesktopCreate;

View file

@ -439,10 +439,15 @@ CmUnRegisterCallback(IN LARGE_INTEGER Cookie);
NTSTATUS STDCALL NTSTATUS STDCALL
CmiObjectParse(IN PVOID ParsedObject, CmiObjectParse(IN PVOID ParsedObject,
OUT PVOID *NextObject, IN PVOID ObjectType,
IN PUNICODE_STRING FullPath, IN OUT PACCESS_STATE AccessState,
IN OUT PWSTR *Path, IN KPROCESSOR_MODE AccessMode,
IN ULONG Attribute); 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 VOID STDCALL
CmiObjectDelete(PVOID DeletedObject); CmiObjectDelete(PVOID DeletedObject);

View file

@ -369,7 +369,7 @@ CmInitializeRegistry(VOID)
ObjectTypeInitializer.ValidAccessMask = KEY_ALL_ACCESS; ObjectTypeInitializer.ValidAccessMask = KEY_ALL_ACCESS;
ObjectTypeInitializer.UseDefaultObject = TRUE; ObjectTypeInitializer.UseDefaultObject = TRUE;
ObjectTypeInitializer.DeleteProcedure = CmiObjectDelete; ObjectTypeInitializer.DeleteProcedure = CmiObjectDelete;
ObjectTypeInitializer.ParseProcedure = (PVOID)CmiObjectParse; ObjectTypeInitializer.ParseProcedure = CmiObjectParse;
ObjectTypeInitializer.SecurityProcedure = CmiObjectSecurity; ObjectTypeInitializer.SecurityProcedure = CmiObjectSecurity;
ObjectTypeInitializer.QueryNameProcedure = CmiObjectQueryName; ObjectTypeInitializer.QueryNameProcedure = CmiObjectQueryName;

View file

@ -24,12 +24,18 @@ CmiGetLinkTarget(PREGISTRY_HIVE RegistryHive,
/* FUNCTONS *****************************************************************/ /* FUNCTONS *****************************************************************/
NTSTATUS STDCALL NTSTATUS STDCALL
CmiObjectParse(PVOID ParsedObject, CmiObjectParse(IN PVOID ParsedObject,
PVOID *NextObject, IN PVOID ObjectType,
PUNICODE_STRING FullPath, IN OUT PACCESS_STATE AccessState,
PWSTR *Path, IN KPROCESSOR_MODE AccessMode,
ULONG Attributes) 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; BLOCK_OFFSET BlockOffset;
PKEY_OBJECT FoundObject; PKEY_OBJECT FoundObject;
@ -42,6 +48,7 @@ CmiObjectParse(PVOID ParsedObject,
UNICODE_STRING LinkPath; UNICODE_STRING LinkPath;
UNICODE_STRING TargetPath; UNICODE_STRING TargetPath;
UNICODE_STRING KeyName; UNICODE_STRING KeyName;
PWSTR *Path = &RemainingName->Buffer;
ParsedKey = ParsedObject; ParsedKey = ParsedObject;

View file

@ -36,7 +36,7 @@ static GENERIC_MAPPING ExpDesktopMapping =
}; };
OB_OPEN_METHOD ExpWindowStationObjectOpen = NULL; OB_OPEN_METHOD ExpWindowStationObjectOpen = NULL;
OB_ROS_PARSE_METHOD ExpWindowStationObjectParse = NULL; OB_PARSE_METHOD ExpWindowStationObjectParse = NULL;
OB_DELETE_METHOD ExpWindowStationObjectDelete = NULL; OB_DELETE_METHOD ExpWindowStationObjectDelete = NULL;
OB_ROS_FIND_METHOD ExpWindowStationObjectFind = NULL; OB_ROS_FIND_METHOD ExpWindowStationObjectFind = NULL;
OB_ROS_CREATE_METHOD ExpDesktopObjectCreate = NULL; OB_ROS_CREATE_METHOD ExpDesktopObjectCreate = NULL;
@ -82,20 +82,28 @@ ExpWinStaObjectFind(PVOID WinStaObject,
NTSTATUS NTSTATUS
STDCALL STDCALL
ExpWinStaObjectParse(PVOID Object, ExpWinStaObjectParse(IN PVOID ParseObject,
PVOID *NextObject, IN PVOID ObjectType,
PUNICODE_STRING FullPath, IN OUT PACCESS_STATE AccessState,
PWSTR *Path, IN KPROCESSOR_MODE AccessMode,
ULONG Attributes, IN ULONG Attributes,
POBP_LOOKUP_CONTEXT Context) 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 */ /* Call the Registered Callback */
return ExpWindowStationObjectParse(Object, return ExpWindowStationObjectParse(ParseObject,
NextObject, ObjectType,
FullPath, AccessState,
Path, AccessMode,
Attributes, Attributes,
Context); CompleteName,
RemainingName,
Context,
SecurityQos,
Object);
} }
NTSTATUS NTSTATUS

View file

@ -60,16 +60,6 @@ typedef PVOID
ULONG Attributes 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 BOOLEAN
NTAPI NTAPI
ObpDeleteEntryDirectory(POBP_LOOKUP_CONTEXT Context); ObpDeleteEntryDirectory(POBP_LOOKUP_CONTEXT Context);

View file

@ -37,6 +37,7 @@ ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
PWSTR current; PWSTR current;
UNICODE_STRING PathString; UNICODE_STRING PathString;
ULONG Attributes; ULONG Attributes;
UNICODE_STRING CurrentUs;
PAGED_CODE(); PAGED_CODE();
@ -169,12 +170,19 @@ Next:
DPRINT("Current object can't parse\n"); DPRINT("Current object can't parse\n");
break; break;
} }
Status = ((OB_ROS_PARSE_METHOD)CurrentHeader->Type->TypeInfo.ParseProcedure)(CurrentObject,
&NextObject, RtlInitUnicodeString(&CurrentUs, current);
&PathString, Status = CurrentHeader->Type->TypeInfo.ParseProcedure(CurrentObject,
&current, CurrentHeader->Type,
NULL,
ExGetPreviousMode(),
Attributes, Attributes,
Context); &PathString,
&CurrentUs,
NULL,
NULL,
&NextObject);
current = CurrentUs.Buffer;
if (Status == STATUS_REPARSE) if (Status == STATUS_REPARSE)
{ {
/* reparse the object path */ /* reparse the object path */

View file

@ -86,16 +86,22 @@ ObpDeleteSymbolicLink(PVOID ObjectBody)
*--*/ *--*/
NTSTATUS NTSTATUS
NTAPI NTAPI
ObpParseSymbolicLink(PVOID Object, ObpParseSymbolicLink(IN PVOID ParsedObject,
PVOID * NextObject, IN PVOID ObjectType,
PUNICODE_STRING FullPath, IN OUT PACCESS_STATE AccessState,
PWSTR * RemainingPath, IN KPROCESSOR_MODE AccessMode,
ULONG Attributes) 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; PUNICODE_STRING TargetPath;
PWSTR NewTargetPath; PWSTR NewTargetPath;
ULONG LengthUsed, MaximumLength, RemainLength; ULONG LengthUsed, MaximumLength, RemainLength;
PWSTR *RemainingPath = &RemainingName->Buffer;
/* /*
* Stop parsing if the entire path has been parsed and * Stop parsing if the entire path has been parsed and
@ -186,7 +192,7 @@ ObInitSymbolicLinkImplementation(VOID)
ObjectTypeInitializer.PoolType = NonPagedPool; ObjectTypeInitializer.PoolType = NonPagedPool;
ObjectTypeInitializer.ValidAccessMask = SYMBOLIC_LINK_ALL_ACCESS; ObjectTypeInitializer.ValidAccessMask = SYMBOLIC_LINK_ALL_ACCESS;
ObjectTypeInitializer.UseDefaultObject = TRUE; ObjectTypeInitializer.UseDefaultObject = TRUE;
ObjectTypeInitializer.ParseProcedure = (OB_PARSE_METHOD)ObpParseSymbolicLink; ObjectTypeInitializer.ParseProcedure = ObpParseSymbolicLink;
ObjectTypeInitializer.DeleteProcedure = ObpDeleteSymbolicLink; ObjectTypeInitializer.DeleteProcedure = ObpDeleteSymbolicLink;
ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ObSymbolicLinkType); ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ObSymbolicLinkType);
} }

View file

@ -21,7 +21,7 @@ static PKWIN32_PROCESS_CALLOUT PspWin32ProcessCallback = NULL;
static PKWIN32_THREAD_CALLOUT PspWin32ThreadCallback = NULL; static PKWIN32_THREAD_CALLOUT PspWin32ThreadCallback = NULL;
extern OB_OPEN_METHOD ExpWindowStationObjectOpen; extern OB_OPEN_METHOD ExpWindowStationObjectOpen;
extern OB_ROS_PARSE_METHOD ExpWindowStationObjectParse; extern OB_PARSE_METHOD ExpWindowStationObjectParse;
extern OB_DELETE_METHOD ExpWindowStationObjectDelete; extern OB_DELETE_METHOD ExpWindowStationObjectDelete;
extern OB_ROS_FIND_METHOD ExpWindowStationObjectFind; extern OB_ROS_FIND_METHOD ExpWindowStationObjectFind;
extern OB_ROS_CREATE_METHOD ExpDesktopObjectCreate; extern OB_ROS_CREATE_METHOD ExpDesktopObjectCreate;

View file

@ -70,12 +70,16 @@ IntWinStaObjectFind(PVOID Object,
NTSTATUS NTSTATUS
STDCALL STDCALL
IntWinStaObjectParse(PVOID Object, IntWinStaObjectParse(IN PVOID ParseObject,
PVOID *NextObject, IN PVOID ObjectType,
PUNICODE_STRING FullPath, IN OUT PACCESS_STATE AccessState,
PWSTR *Path, IN KPROCESSOR_MODE AccessMode,
ULONG Attributes, IN ULONG Attributes,
PVOID Context); 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 NTSTATUS FASTCALL
IntValidateWindowStationHandle( IntValidateWindowStationHandle(

View file

@ -382,7 +382,7 @@ DriverEntry (
* Register Object Manager Callbacks * Register Object Manager Callbacks
*/ */
CalloutData.WinStaOpen = IntWinStaObjectOpen; CalloutData.WinStaOpen = IntWinStaObjectOpen;
CalloutData.WinStaParse = (OB_ROS_PARSE_METHOD)IntWinStaObjectParse; CalloutData.WinStaParse = IntWinStaObjectParse;
CalloutData.WinStaDelete = IntWinStaObjectDelete; CalloutData.WinStaDelete = IntWinStaObjectDelete;
CalloutData.WinStaFind = IntWinStaObjectFind; CalloutData.WinStaFind = IntWinStaObjectFind;
CalloutData.DesktopCreate = IntDesktopObjectCreate; CalloutData.DesktopCreate = IntDesktopObjectCreate;

View file

@ -186,13 +186,18 @@ IntWinStaObjectFind(PVOID Object,
NTSTATUS NTSTATUS
STDCALL STDCALL
IntWinStaObjectParse(PVOID Object, IntWinStaObjectParse(IN PVOID Object,
PVOID *NextObject, IN PVOID ObjectType,
PUNICODE_STRING FullPath, IN OUT PACCESS_STATE AccessState,
PWSTR *Path, IN KPROCESSOR_MODE AccessMode,
ULONG Attributes, IN ULONG Attributes,
PVOID Context) 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; PVOID FoundObject;
NTSTATUS Status; NTSTATUS Status;
PWSTR End; PWSTR End;