-/* $Id: create.c,v 1.47 2001/08/26 17:27:00 ekohl Exp $
+/* $Id: create.c,v 1.54 2002/04/01 22:18:01 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
}
if (IoDeviceObjectType != BODY_TO_HEADER(Parent)->ObjectType)
{
- CPRINT("Parent is a %S which not a device type\n",
+ CPRINT("Parent is a %S which is not a device type\n",
BODY_TO_HEADER(Parent)->ObjectType->TypeName.Buffer);
return (STATUS_UNSUCCESSFUL);
}
&& (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT))
{
CPRINT ("Device was wrong type\n");
- assert(FALSE);
return (STATUS_UNSUCCESSFUL);
}
DPRINT("Status %x\n", Status);
if (!NT_SUCCESS(Status))
{
- CPRINT("Failed to mount storage device (statux %x)\n",
+ CPRINT("Failed to mount storage device (status %x)\n",
Status);
return (Status);
}
*
*/
NTSTATUS STDCALL
-IoCreateFile(
- OUT PHANDLE FileHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- IN ULONG FileAttributes,
- IN ULONG ShareAccess,
- IN ULONG CreateDisposition,
- IN ULONG CreateOptions,
- IN PVOID EaBuffer OPTIONAL,
- IN ULONG EaLength,
- IN CREATE_FILE_TYPE CreateFileType,
- IN PVOID ExtraCreateParameters OPTIONAL,
- IN ULONG Options)
+IoCreateFile(OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG CreateDisposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength,
+ IN CREATE_FILE_TYPE CreateFileType,
+ IN PVOID ExtraCreateParameters OPTIONAL,
+ IN ULONG Options)
{
PFILE_OBJECT FileObject;
NTSTATUS Status;
PIRP Irp;
- KEVENT Event;
+ KEVENT Event;
PIO_STACK_LOCATION StackLoc;
+ IO_STATUS_BLOCK IoSB;
+ IO_SECURITY_CONTEXT SecurityContext;
DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
"ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
{
FileObject->Flags |= FO_SYNCHRONOUS_IO;
}
+
+ if( CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING )
+ FileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
+
+ SecurityContext.SecurityQos = NULL; /* ?? */
+ SecurityContext.AccessState = NULL; /* ?? */
+ SecurityContext.DesiredAccess = DesiredAccess;
+ SecurityContext.FullCreateOptions = 0; /* ?? */
+
KeInitializeEvent(&FileObject->Lock, NotificationEvent, TRUE);
KeInitializeEvent(&Event, NotificationEvent, FALSE);
return (STATUS_UNSUCCESSFUL);
}
- Irp->UserIosb = IoStatusBlock; //return iostatus
+ Irp->UserIosb = &IoSB; //return iostatus
Irp->AssociatedIrp.SystemBuffer = EaBuffer;
Irp->Tail.Overlay.AuxiliaryBuffer = (PCHAR)ExtraCreateParameters;
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();
+ Irp->UserEvent = &Event;
/*
* Get the stack location for the new
break;
}
StackLoc->MinorFunction = 0;
- StackLoc->Flags = 0;
+ StackLoc->Flags = Options;
StackLoc->Control = 0;
StackLoc->DeviceObject = FileObject->DeviceObject;
StackLoc->FileObject = FileObject;
+ StackLoc->Parameters.Create.SecurityContext = &SecurityContext;
StackLoc->Parameters.Create.Options = (CreateOptions & FILE_VALID_OPTION_FLAGS);
StackLoc->Parameters.Create.Options |= (CreateDisposition << 24);
+ StackLoc->Parameters.Create.FileAttributes = FileAttributes;
+ StackLoc->Parameters.Create.ShareAccess = ShareAccess;
+ StackLoc->Parameters.Create.EaLength = EaLength;
/*
* Now call the driver and
KernelMode,
FALSE,
NULL);
- Status = IoStatusBlock->Status;
+ Status = IoSB.Status;
}
if (!NT_SUCCESS(Status))
{
DPRINT("Failing create request with status %x\n", Status);
ZwClose(*FileHandle);
}
-
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
+ }
assert_irql(PASSIVE_LEVEL);
DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));