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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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,
&current,
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 */

View file

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

View file

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

View file

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

View file

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

View file

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