POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL;
POBJECT_TYPE EXPORTED IoFileObjectType = NULL;
+#ifndef LIBCAPTIVE
ULONG EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */
ULONG EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */
ULONG EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
ULONG EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */
ULONG EXPORTED IoStatisticsLock = 0; /* FIXME: unknown type */
+#endif /* LIBCAPTIVE */
static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
FILE_GENERIC_WRITE,
DPRINT("IopCloseFile()\n");
- if (HandleCount > 0)
+ if (HandleCount > 0 || FileObject->DeviceObject == NULL)
{
return;
}
STANDARD_RIGHTS_REQUIRED,
IoFileObjectType,
UserMode);
-
+ KeResetEvent( &FileObject->Event );
+
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
FileObject->DeviceObject,
NULL,
StackPtr->FileObject = FileObject;
Status = IoCallDriver(FileObject->DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
+ }
}
VOID STDCALL
NTSTATUS Status;
DPRINT("IopDeleteFile()\n");
+
+ if (FileObject->DeviceObject)
+ {
+ ObReferenceObjectByPointer(ObjectBody,
+ STANDARD_RIGHTS_REQUIRED,
+ IoFileObjectType,
+ UserMode);
- ObReferenceObjectByPointer(ObjectBody,
- STANDARD_RIGHTS_REQUIRED,
- IoFileObjectType,
- UserMode);
+ KeResetEvent( &FileObject->Event );
+ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
+ FileObject->DeviceObject,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL);
+ StackPtr = IoGetNextIrpStackLocation(Irp);
+ StackPtr->FileObject = FileObject;
- Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
- FileObject->DeviceObject,
- NULL,
- 0,
- NULL,
- NULL,
- NULL);
- StackPtr = IoGetNextIrpStackLocation(Irp);
- StackPtr->FileObject = FileObject;
-
- Status = IoCallDriver(FileObject->DeviceObject, Irp);
+ Status = IoCallDriver(FileObject->DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
+ }
+ }
if (FileObject->FileName.Buffer != NULL)
{
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DirName;
+#ifndef LIBCAPTIVE
UNICODE_STRING LinkName;
+#endif /* LIBCAPTIVE */
HANDLE Handle;
+#ifndef LIBCAPTIVE
IopInitDriverImplementation();
+#endif /* LIBCAPTIVE */
/*
* Register iomgr types: DeviceObjectType
IoDeviceObjectType->Create = IopCreateDevice;
IoDeviceObjectType->DuplicationNotify = NULL;
- RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
+ RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
/*
* Register iomgr types: FileObjectType
IoFileObjectType->Create = IopCreateFile;
IoFileObjectType->DuplicationNotify = NULL;
- RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
+ RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
/*
* Create the '\Driver' object directory
*/
- RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
+ RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
InitializeObjectAttributes(&ObjectAttributes,
&DirName,
0,
* Create the '\FileSystem' object directory
*/
RtlInitUnicodeStringFromLiteral(&DirName,
- L"\\FileSystem");
+ REACTOS_UCS2(L"\\FileSystem"));
InitializeObjectAttributes(&ObjectAttributes,
&DirName,
0,
* Create the '\Device' directory
*/
RtlInitUnicodeStringFromLiteral(&DirName,
- L"\\Device");
+ REACTOS_UCS2(L"\\Device"));
InitializeObjectAttributes(&ObjectAttributes,
&DirName,
0,
0,
&ObjectAttributes);
+#ifndef LIBCAPTIVE
/*
* Create the '\??' directory
*/
RtlInitUnicodeStringFromLiteral(&DirName,
- L"\\??");
+ REACTOS_UCS2(L"\\??"));
InitializeObjectAttributes(&ObjectAttributes,
&DirName,
0,
* Create the '\ArcName' directory
*/
RtlInitUnicodeStringFromLiteral(&DirName,
- L"\\ArcName");
+ REACTOS_UCS2(L"\\ArcName"));
InitializeObjectAttributes(&ObjectAttributes,
&DirName,
0,
*/
IoInitCancelHandling();
IoInitSymbolicLinkImplementation();
+#endif /* LIBCAPTIVE */
IoInitFileSystemImplementation();
IoInitVpbImplementation();
IoInitShutdownNotification();
/*
* Create link from '\DosDevices' to '\??' directory
*/
+#ifndef LIBCAPTIVE
RtlInitUnicodeStringFromLiteral(&LinkName,
L"\\DosDevices");
RtlInitUnicodeStringFromLiteral(&DirName,
* Initialize PnP manager
*/
PnpInit();
+#endif /* LIBCAPTIVE */
}