-/* $Id: create.c,v 1.42 2001/05/13 13:35:37 chorns 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
*
*/
NTSTATUS STDCALL
-NtDeleteFile (IN POBJECT_ATTRIBUTES ObjectAttributes)
+NtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
{
UNIMPLEMENTED;
}
* REVISIONS
*
*/
-NTSTATUS
-IopCreateFile (PVOID ObjectBody,
- PVOID Parent,
- PWSTR RemainingPath,
- POBJECT_ATTRIBUTES ObjectAttributes)
+NTSTATUS STDCALL
+IopCreateFile(PVOID ObjectBody,
+ PVOID Parent,
+ PWSTR RemainingPath,
+ POBJECT_ATTRIBUTES ObjectAttributes)
{
PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT) Parent;
PFILE_OBJECT FileObject = (PFILE_OBJECT) ObjectBody;
}
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);
}
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
FileObject->FileName.Buffer =
ExAllocatePoolWithTag(NonPagedPool,
- (ObjectAttributes->ObjectName->Length+1)*2,
+ (ObjectAttributes->ObjectName->Length+1)*sizeof(WCHAR),
TAG_FILE_NAME);
FileObject->FileName.Length = ObjectAttributes->ObjectName->Length;
FileObject->FileName.MaximumLength =
&& (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);
}
{
HANDLE FileHandle;
PFILE_OBJECT CreatedFileObject;
+ NTSTATUS Status;
DPRINT("IoCreateStreamFileObject(FileObject %x, DeviceObject %x)\n",
FileObject, DeviceObject);
assert_irql (PASSIVE_LEVEL);
- CreatedFileObject = ObCreateObject (&FileHandle,
- STANDARD_RIGHTS_REQUIRED,
- NULL,
- IoFileObjectType);
- if (NULL == CreatedFileObject)
+ Status = ObCreateObject (&FileHandle,
+ STANDARD_RIGHTS_REQUIRED,
+ NULL,
+ IoFileObjectType,
+ (PVOID*)&CreatedFileObject);
+ if (!NT_SUCCESS(Status))
{
DPRINT("Could not create FileObject\n");
return (NULL);
*
*/
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",
*FileHandle = 0;
- FileObject = ObCreateObject(FileHandle,
- DesiredAccess,
- ObjectAttributes,
- IoFileObjectType);
- if (FileObject == NULL)
+ Status = ObCreateObject(FileHandle,
+ DesiredAccess,
+ ObjectAttributes,
+ IoFileObjectType,
+ (PVOID*)&FileObject);
+ if (!NT_SUCCESS(Status))
{
- DPRINT1("ObCreateObject() failed!\n");
- return (STATUS_UNSUCCESSFUL);
+ DPRINT("ObCreateObject() failed!\n");
+ return (Status);
}
if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
{
{
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);
Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE);
if (Irp == NULL)
{
+ ZwClose(*FileHandle);
return (STATUS_UNSUCCESSFUL);
}
-
+
+ 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
* immediately.
*/
Status = IofCallDriver(FileObject->DeviceObject, Irp );
+
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,
KernelMode,
FALSE,
NULL);
- Status = IoStatusBlock->Status;
+ Status = IoSB.Status;
}
if (!NT_SUCCESS(Status))
{
- DPRINT1("Failing create request with status %x\n", Status);
+ DPRINT("Failing create request with status %x\n", Status);
ZwClose(*FileHandle);
- (*FileHandle) = 0;
}
-
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
+ }
assert_irql(PASSIVE_LEVEL);
DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));