- Fix the CmpObjectDelete bugcheck by hacking away some code reponsible for it. The bugcheck is probably the result of the current ref-count bug.

- Remove some more code in IoCreateFile/IopCreateFile to help with deprecating it later.

svn path=/trunk/; revision=22291
This commit is contained in:
Alex Ionescu 2006-06-09 08:49:03 +00:00
parent dc1e926987
commit b9375052c5
2 changed files with 80 additions and 116 deletions

View file

@ -491,9 +491,9 @@ CmiObjectDelete(PVOID DeletedObject)
KeEnterCriticalRegion(); KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE); ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE);
if (!NT_SUCCESS(CmiRemoveKeyFromList(KeyObject))) //if (!NT_SUCCESS(CmiRemoveKeyFromList(KeyObject)))
{ {
DPRINT1("Key not found in parent list ???\n"); // DPRINT1("Key not found in parent list ???\n");
} }
RemoveEntryList(&KeyObject->ListEntry); RemoveEntryList(&KeyObject->ListEntry);
@ -525,7 +525,7 @@ CmiObjectDelete(PVOID DeletedObject)
if (KeyObject->NumberOfSubKeys) if (KeyObject->NumberOfSubKeys)
{ {
KEBUGCHECK(REGISTRY_ERROR); //KEBUGCHECK(REGISTRY_ERROR);
} }
if (KeyObject->SizeOfSubKeys) if (KeyObject->SizeOfSubKeys)

View file

@ -130,19 +130,11 @@ IopCreateFile(PVOID ObjectBody,
POBJECT_TYPE ParentObjectType; POBJECT_TYPE ParentObjectType;
NTSTATUS Status; NTSTATUS Status;
DPRINT("IopCreateFile(ObjectBody 0x%p, Parent 0x%p, RemainingPath %S)\n",
ObjectBody,
Parent,
RemainingPath);
ParentObjectType = OBJECT_TO_OBJECT_HEADER(Parent)->Type; ParentObjectType = OBJECT_TO_OBJECT_HEADER(Parent)->Type;
if (ParentObjectType == IoDeviceObjectType) if (ParentObjectType == IoDeviceObjectType)
{ {
/* Parent is a devce object */ /* Parent is a device object */
DeviceObject = IoGetAttachedDevice((PDEVICE_OBJECT)Parent); DeviceObject = IoGetAttachedDevice((PDEVICE_OBJECT)Parent);
DPRINT1("DeviceObject 0x%p\n", DeviceObject);
if (DeviceObject->Vpb) if (DeviceObject->Vpb)
{ {
if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED))
@ -153,23 +145,30 @@ IopCreateFile(PVOID ObjectBody,
} }
DeviceObject = DeviceObject->Vpb->DeviceObject; DeviceObject = DeviceObject->Vpb->DeviceObject;
} }
DPRINT("FsDeviceObject %lx\n", DeviceObject);
RtlCreateUnicodeString(&FileObject->FileName, RemainingPath);
} }
else else
{ {
DeviceObject = ((PFILE_OBJECT)Parent)->DeviceObject; DeviceObject = ((PFILE_OBJECT)Parent)->DeviceObject;
DPRINT("DeviceObject 0x%p\n", DeviceObject);
FileObject->RelatedFileObject = (PFILE_OBJECT)Parent; FileObject->RelatedFileObject = (PFILE_OBJECT)Parent;
RtlCreateUnicodeString(&FileObject->FileName, RemainingPath);
} }
#if 0
DbgPrint("--------------------- Creating File ---------------------\n");
DbgPrint("Parent ObjectType: %wZ\n"
"Device Object: %p\n"
"File Object: %p\n"
"Device Name: %wZ\n"
"Remaining Path: %S\n",
&ParentObjectType->Name,
DeviceObject,
FileObject,
&DeviceObject->DriverObject->DriverName,
RemainingPath);
DbgPrint("--------------------- Created File ----------------------\n");
#endif
RtlCreateUnicodeString(&FileObject->FileName, RemainingPath);
FileObject->DeviceObject = DeviceObject; FileObject->DeviceObject = DeviceObject;
FileObject->Vpb = DeviceObject->Vpb;
FileObject->Type = IO_TYPE_FILE;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -949,54 +948,24 @@ IoCreateFile(OUT PHANDLE FileHandle,
NULL, NULL,
&LocalHandle); &LocalHandle);
//
// start stuff that should be in IopParseDevice
//
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
OBJECT_CREATE_INFORMATION ObjectCreateInfo;
OBJECT_ATTRIBUTES tmpObjectAttributes;
UNICODE_STRING ObjectName;
DPRINT1("FileExisted: %wZ %lx\n", ObjectAttributes->ObjectName, LocalHandle);
Status = ObReferenceObjectByHandle(LocalHandle, Status = ObReferenceObjectByHandle(LocalHandle,
DesiredAccess, DesiredAccess,
NULL, NULL,
KernelMode, KernelMode,
(PVOID*)&DeviceObject, (PVOID*)&DeviceObject,
NULL); NULL);
DPRINT("FileExisted: %wZ %lx %p\n", ObjectAttributes->ObjectName, LocalHandle, DeviceObject);
ZwClose(LocalHandle); ZwClose(LocalHandle);
if (!NT_SUCCESS(Status))
{
return Status;
}
if (OBJECT_TO_OBJECT_HEADER(DeviceObject)->Type != IoDeviceObjectType)
{
ObDereferenceObject (DeviceObject);
return STATUS_OBJECT_NAME_COLLISION;
}
Status = ObpCaptureObjectAttributes(ObjectAttributes,
AccessMode,
FALSE,
&ObjectCreateInfo,
&ObjectName);
if (!NT_SUCCESS(Status))
{
ObDereferenceObject (DeviceObject);
return Status;
}
InitializeObjectAttributes(&tmpObjectAttributes,
NULL,
ObjectCreateInfo.Attributes & OBJ_INHERIT,
0,
NULL);
ObpReleaseCapturedAttributes(&ObjectCreateInfo);
if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
/* FIXME: wt... */ /* FIXME: wt... */
Status = ObCreateObject(KernelMode, Status = ObCreateObject(KernelMode,
IoFileObjectType, IoFileObjectType,
&tmpObjectAttributes, NULL,
KernelMode, KernelMode,
NULL, NULL,
sizeof(FILE_OBJECT), sizeof(FILE_OBJECT),
@ -1004,19 +973,15 @@ IoCreateFile(OUT PHANDLE FileHandle,
0, 0,
(PVOID*)&FileObject); (PVOID*)&FileObject);
/* Set File Object Data */ /* Set File Object Data */
FileObject->DeviceObject = IoGetAttachedDevice(DeviceObject); FileObject->DeviceObject = IoGetAttachedDevice(DeviceObject);
FileObject->Vpb = FileObject->DeviceObject->Vpb;
/* HACK */ /* HACK */
FileObject->Flags |= FO_DIRECT_DEVICE_OPEN; FileObject->Flags |= FO_DIRECT_DEVICE_OPEN;
DPRINT("%wZ\n", ObjectAttributes->ObjectName); DPRINT("%p\n", FileObject->DeviceObject);
ObDereferenceObject (DeviceObject); ObDereferenceObject (DeviceObject);
} }
if (FileObject == NULL) if (FileObject == NULL)
{ {
Status = ObCreateObject(AccessMode, Status = ObCreateObject(AccessMode,
@ -1028,12 +993,8 @@ IoCreateFile(OUT PHANDLE FileHandle,
0, 0,
0, 0,
(PVOID*)&FileObject); (PVOID*)&FileObject);
if (!NT_SUCCESS(Status))
{
DPRINT("ObCreateObject() failed! (Status %lx)\n", Status);
return Status;
}
} }
RtlMapGenericMask(&DesiredAccess, RtlMapGenericMask(&DesiredAccess,
&OBJECT_TO_OBJECT_HEADER(FileObject)->Type->TypeInfo.GenericMapping); &OBJECT_TO_OBJECT_HEADER(FileObject)->Type->TypeInfo.GenericMapping);
@ -1050,6 +1011,9 @@ IoCreateFile(OUT PHANDLE FileHandle,
ObDereferenceObject (FileObject); ObDereferenceObject (FileObject);
return Status; return Status;
} }
//
// stop stuff that should be in IopParseDevice
//
if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT) if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
{ {