Patch by Pierre Schweitzer.
authorMichael Martin <michael.martin@reactos.org>
Mon, 30 Aug 2010 11:51:17 +0000 (11:51 +0000)
committerMichael Martin <michael.martin@reactos.org>
Mon, 30 Aug 2010 11:51:17 +0000 (11:51 +0000)
[CDFS]
- Several fixes for directory information query.
- Fixed a null access memory under certain circumstances.
- Added support for media ejection.
[FASTFAT]
- Fixed calls to CcMapData(), CcPinRead().
- Fixed an endless loop in FCB management under certain circumstances.
[NTOSKRNL]
- Fixed wrong prototype for IopParseDevice().

svn path=/trunk/; revision=48654

14 files changed:
reactos/drivers/filesystems/cdfs/cdfs.c
reactos/drivers/filesystems/cdfs/cdfs.h
reactos/drivers/filesystems/cdfs/cdfs.rbuild
reactos/drivers/filesystems/cdfs/common.c
reactos/drivers/filesystems/cdfs/devctrl.c [new file with mode: 0644]
reactos/drivers/filesystems/cdfs/dirctl.c
reactos/drivers/filesystems/cdfs/fcb.c
reactos/drivers/filesystems/fastfat/create.c
reactos/drivers/filesystems/fastfat/direntry.c
reactos/drivers/filesystems/fastfat/dirwr.c
reactos/drivers/filesystems/fastfat/fcb.c
reactos/drivers/filesystems/fastfat/volume.c
reactos/ntoskrnl/include/internal/io.h
reactos/ntoskrnl/io/iomgr/file.c

index 28eb370..172282e 100644 (file)
@@ -95,6 +95,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
         CdfsQueryVolumeInformation;
     DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] =
         CdfsSetVolumeInformation;
+    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
+        CdfsDeviceControl;
 
     DriverObject->DriverUnload = NULL;
 
index 3b114ef..905a34e 100644 (file)
@@ -277,13 +277,17 @@ CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
                     IN OUT PULONG pOutputBufferSize,
                     IN BOOLEAN Override);
 
-
 /* create.c */
 
 NTSTATUS NTAPI
 CdfsCreate(PDEVICE_OBJECT DeviceObject,
           PIRP Irp);
 
+/* devctrl.c */
+
+NTSTATUS NTAPI
+CdfsDeviceControl(PDEVICE_OBJECT DeviceObject,
+                  PIRP Irp);
 
 /* dirctl.c */
 
index 2aed0e8..ef0edec 100644 (file)
@@ -10,6 +10,7 @@
        <file>close.c</file>
        <file>common.c</file>
        <file>create.c</file>
+   <file>devctrl.c</file>
        <file>dirctl.c</file>
        <file>fcb.c</file>
        <file>finfo.c</file>
index 3a3722e..dd47a78 100644 (file)
@@ -197,8 +197,11 @@ CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
         DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread());
         IoSetDeviceToVerify(PsGetCurrentThread(), NULL);
 
-        NewStatus = IoVerifyVolume(DeviceToVerify, FALSE);
-        DPRINT1("IoVerifyVolume() returned (Status %lx)\n", NewStatus);
+        if (DeviceToVerify)
+        {
+            NewStatus = IoVerifyVolume(DeviceToVerify, FALSE);
+            DPRINT1("IoVerifyVolume() returned (Status %lx)\n", NewStatus);
+        }
     }
 
     DPRINT("Returning Status %x\n", Status);
diff --git a/reactos/drivers/filesystems/cdfs/devctrl.c b/reactos/drivers/filesystems/cdfs/devctrl.c
new file mode 100644 (file)
index 0000000..cee4ba5
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * COPYRIGHT:        See COPYING in the top level directory
+ * PROJECT:          ReactOS kernel
+ * FILE:             drivers/filesystems/cdfs/devctrl.c
+ * PURPOSE:          CDROM (ISO 9660) filesystem driver
+ * PROGRAMMER:       Pierre Schweitzer
+ *
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include "cdfs.h"
+
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ****************************************************************/
+
+NTSTATUS NTAPI
+CdfsDeviceControl(PDEVICE_OBJECT DeviceObject,
+                  PIRP Irp)
+{
+    NTSTATUS Status;
+    PVCB Vcb = NULL;
+    PFILE_OBJECT FileObject;
+    PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
+
+    FileObject = Stack->FileObject;
+    Irp->IoStatus.Information = 0;
+
+    /* FIXME: HACK, it means that CD has changed */
+    if (!FileObject)
+    {
+        DPRINT1("FIXME: CdfsDeviceControl called without FileObject!\n");
+        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INVALID_DEVICE_REQUEST;
+    }
+
+    /* Only support such operations on volume */
+    if (!(FileObject->RelatedFileObject == NULL || FileObject->RelatedFileObject->FsContext2 != NULL))
+    {
+        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    if (Stack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_DISK_TYPE)
+    {
+        /* We should handle this one, but we don't! */
+        Status = STATUS_NOT_IMPLEMENTED;
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+    else
+    {
+        /* Pass it to storage driver */
+        IoSkipCurrentIrpStackLocation(Irp);
+        Vcb = (PVCB)Stack->DeviceObject->DeviceExtension;
+        Status = IoCallDriver(Vcb->StorageDevice, Irp);
+    }
+
+    return Status;
+}
index 1239988..0160c92 100644 (file)
@@ -376,13 +376,15 @@ CdfsGetNameInformation(PFCB Fcb,
     DPRINT("CdfsGetNameInformation() called\n");
 
     Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
-    if ((sizeof (FILE_BOTH_DIR_INFORMATION) + Length) > BufferLength)
+    if ((sizeof(FILE_NAMES_INFORMATION) + Length) > BufferLength)
         return(STATUS_BUFFER_OVERFLOW);
 
     Info->FileNameLength = Length;
     Info->NextEntryOffset =
-        ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, 4);
-    memcpy(Info->FileName, Fcb->ObjectName, Length);
+        ROUND_UP(sizeof(FILE_NAMES_INFORMATION) + Length, sizeof(ULONG));
+    RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
+
+    //  Info->FileIndex=;
 
     return(STATUS_SUCCESS);
 }
@@ -399,31 +401,27 @@ CdfsGetDirectoryInformation(PFCB Fcb,
     DPRINT("CdfsGetDirectoryInformation() called\n");
 
     Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
-    if ((sizeof (FILE_BOTH_DIR_INFORMATION) + Length) > BufferLength)
+    if ((sizeof (FILE_DIRECTORY_INFORMATION) + Length) > BufferLength)
         return(STATUS_BUFFER_OVERFLOW);
 
     Info->FileNameLength = Length;
     Info->NextEntryOffset =
-        ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, 4);
-    memcpy(Info->FileName, Fcb->ObjectName, Length);
+        ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) + Length, sizeof(ULONG));
+    RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
 
     /* Convert file times */
     CdfsDateTimeToSystemTime(Fcb,
         &Info->CreationTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->LastAccessTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->LastWriteTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->ChangeTime);
+    Info->LastWriteTime = Info->CreationTime;
+    Info->ChangeTime = Info->CreationTime;
 
     /* Convert file flags */
     CdfsFileFlagsToAttributes(Fcb,
         &Info->FileAttributes);
     if (CdfsFCBIsDirectory(Fcb))
     {
-        Info->EndOfFile.QuadPart = 0LL;
-        Info->AllocationSize.QuadPart = 0LL;
+        Info->EndOfFile.QuadPart = 0;
+        Info->AllocationSize.QuadPart = 0;
     }
     else
     {
@@ -450,23 +448,19 @@ CdfsGetFullDirectoryInformation(PFCB Fcb,
     DPRINT("CdfsGetFullDirectoryInformation() called\n");
 
     Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
-    if ((sizeof (FILE_BOTH_DIR_INFORMATION) + Length) > BufferLength)
+    if ((sizeof (FILE_FULL_DIR_INFORMATION) + Length) > BufferLength)
         return(STATUS_BUFFER_OVERFLOW);
 
     Info->FileNameLength = Length;
     Info->NextEntryOffset =
-        ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, 4);
-    memcpy(Info->FileName, Fcb->ObjectName, Length);
+        ROUND_UP(sizeof(FILE_FULL_DIR_INFORMATION) + Length, sizeof(ULONG));
+    RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
 
     /* Convert file times */
     CdfsDateTimeToSystemTime(Fcb,
         &Info->CreationTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->LastAccessTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->LastWriteTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->ChangeTime);
+    Info->LastWriteTime = Info->CreationTime;
+    Info->ChangeTime = Info->CreationTime;
 
     /* Convert file flags */
     CdfsFileFlagsToAttributes(Fcb,
@@ -474,8 +468,8 @@ CdfsGetFullDirectoryInformation(PFCB Fcb,
 
     if (CdfsFCBIsDirectory(Fcb))
     {
-        Info->EndOfFile.QuadPart = 0LL;
-        Info->AllocationSize.QuadPart = 0LL;
+        Info->EndOfFile.QuadPart = 0;
+        Info->AllocationSize.QuadPart = 0;
     }
     else
     {
@@ -508,18 +502,14 @@ CdfsGetBothDirectoryInformation(PFCB Fcb,
 
     Info->FileNameLength = Length;
     Info->NextEntryOffset =
-        ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, 4);
-    memcpy(Info->FileName, Fcb->ObjectName, Length);
+        ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, sizeof(ULONG));
+    RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
 
     /* Convert file times */
     CdfsDateTimeToSystemTime(Fcb,
         &Info->CreationTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->LastAccessTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->LastWriteTime);
-    CdfsDateTimeToSystemTime(Fcb,
-        &Info->ChangeTime);
+    Info->LastWriteTime = Info->CreationTime;
+    Info->ChangeTime = Info->CreationTime;
 
     /* Convert file flags */
     CdfsFileFlagsToAttributes(Fcb,
@@ -527,8 +517,8 @@ CdfsGetBothDirectoryInformation(PFCB Fcb,
 
     if (CdfsFCBIsDirectory(Fcb))
     {
-        Info->EndOfFile.QuadPart = 0LL;
-        Info->AllocationSize.QuadPart = 0LL;
+        Info->EndOfFile.QuadPart = 0;
+        Info->AllocationSize.QuadPart = 0;
     }
     else
     {
@@ -542,8 +532,9 @@ CdfsGetBothDirectoryInformation(PFCB Fcb,
     Info->EaSize = 0;
 
     /* Copy short name */
+    ASSERT(Fcb->ShortNameU.Length / sizeof(WCHAR) <= 12);
     Info->ShortNameLength = Fcb->ShortNameU.Length;
-    memcpy(Info->ShortName, Fcb->ShortNameU.Buffer, Fcb->ShortNameU.Length);
+    RtlCopyMemory(Info->ShortName, Fcb->ShortNameU.Buffer, Fcb->ShortNameU.Length);
 
     return(STATUS_SUCCESS);
 }
@@ -584,6 +575,15 @@ CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
         Stack->Parameters.QueryDirectory.FileInformationClass;
     FileIndex = Stack->Parameters.QueryDirectory.FileIndex;
 
+    /* Determine Buffer for result */
+    if (Irp->MdlAddress)
+    {
+        Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
+    }
+    else
+    {
+        Buffer = Irp->UserBuffer;
+    }
 
     if (SearchPattern != NULL)
     {
@@ -596,13 +596,8 @@ CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
             {
                 return STATUS_INSUFFICIENT_RESOURCES;
             }
-
-            Ccb->DirectorySearchPattern.Length = SearchPattern->Length;
             Ccb->DirectorySearchPattern.MaximumLength = SearchPattern->Length + sizeof(WCHAR);
-
-            memcpy(Ccb->DirectorySearchPattern.Buffer,
-                SearchPattern->Buffer,
-                SearchPattern->Length);
+            RtlCopyUnicodeString(&Ccb->DirectorySearchPattern, SearchPattern);
             Ccb->DirectorySearchPattern.Buffer[SearchPattern->Length / sizeof(WCHAR)] = 0;
         }
     }
@@ -625,24 +620,14 @@ CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
     /* Determine directory index */
     if (Stack->Flags & SL_INDEX_SPECIFIED)
     {
-        Ccb->Entry = Ccb->CurrentByteOffset.u.LowPart;
-        Ccb->Offset = 0;
+        Ccb->Entry = Stack->Parameters.QueryDirectory.FileIndex;
+        Ccb->Offset = Ccb->CurrentByteOffset.u.LowPart;
     }
     else if (First || (Stack->Flags & SL_RESTART_SCAN))
     {
         Ccb->Entry = 0;
         Ccb->Offset = 0;
     }
-
-    /* Determine Buffer for result */
-    if (Irp->MdlAddress)
-    {
-        Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
-    }
-    else
-    {
-        Buffer = Irp->UserBuffer;
-    }
     DPRINT("Buffer = %p  tofind = %wZ\n", Buffer, &Ccb->DirectorySearchPattern);
 
     TempFcb.ObjectName = TempFcb.PathName;
index a7dd385..12bee1d 100644 (file)
@@ -233,7 +233,6 @@ CdfsFCBInitializeCache(PVCB Vcb,
                        PFCB Fcb)
 {
     PFILE_OBJECT FileObject;
-    NTSTATUS Status;
     PCCB  newCCB;
 
     FileObject = IoCreateStreamFileObject(NULL, Vcb->StorageDevice);
@@ -241,7 +240,7 @@ CdfsFCBInitializeCache(PVCB Vcb,
     newCCB = ExAllocatePoolWithTag(NonPagedPool, sizeof(CCB), TAG_CCB);
     if (newCCB == NULL)
     {
-        return(STATUS_INSUFFICIENT_RESOURCES);
+        return STATUS_INSUFFICIENT_RESOURCES;
     }
     RtlZeroMemory(newCCB,
         sizeof(CCB));
@@ -256,7 +255,6 @@ CdfsFCBInitializeCache(PVCB Vcb,
     Fcb->FileObject = FileObject;
     Fcb->DevExt = Vcb;
 
-    Status = STATUS_SUCCESS;
     CcInitializeCacheMap(FileObject,
         (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
         FALSE,
@@ -266,7 +264,7 @@ CdfsFCBInitializeCache(PVCB Vcb,
     ObDereferenceObject(FileObject);
     Fcb->Flags |= FCB_CACHE_INITIALIZED;
 
-    return(Status);
+    return STATUS_SUCCESS;
 }
 
 
@@ -434,6 +432,9 @@ CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
     }
     memset(newCCB, 0, sizeof(CCB));
 
+    FileObject->ReadAccess = TRUE;
+    FileObject->WriteAccess = FALSE;
+    FileObject->DeleteAccess = FALSE;
     FileObject->SectionObjectPointer = &Fcb->SectionObjectPointers;
     FileObject->FsContext = Fcb;
     FileObject->FsContext2 = newCCB;
index f643104..514084e 100644 (file)
@@ -125,7 +125,7 @@ ReadVolumeLabel (PDEVICE_EXTENSION DeviceExt, PVPB Vpb)
        ExReleaseResourceLite (&DeviceExt->DirResource);
 
        FileOffset.QuadPart = 0;
-       if (CcMapData(pFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&Entry))
+       if (CcMapData(pFcb->FileObject, &FileOffset, SizeDirEntry, TRUE, &Context, (PVOID*)&Entry))
        {
                while (TRUE)
                {
@@ -155,7 +155,7 @@ ReadVolumeLabel (PDEVICE_EXTENSION DeviceExt, PVPB Vpb)
                        {
                                CcUnpinData(Context);
                                FileOffset.u.LowPart += PAGE_SIZE;
-                               if (!CcMapData(pFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&Entry))
+                               if (!CcMapData(pFcb->FileObject, &FileOffset, SizeDirEntry, TRUE, &Context, (PVOID*)&Entry))
                                {
                                        Context = NULL;
                                        break;
index 1a1577c..0601029 100644 (file)
@@ -66,7 +66,7 @@ FATIsDirectoryEmpty(PVFATFCB Fcb)
                 CcUnpinData(Context);
             }
 
-            if (!CcMapData(Fcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&FatDirEntry))
+            if (!CcMapData(Fcb->FileObject, &FileOffset, sizeof(FAT_DIR_ENTRY), TRUE, &Context, (PVOID*)&FatDirEntry))
             {
                 return TRUE;
             }
@@ -120,7 +120,7 @@ FATXIsDirectoryEmpty(PVFATFCB Fcb)
                 CcUnpinData(Context);
             }
 
-            if (!CcMapData(Fcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&FatXDirEntry))
+            if (!CcMapData(Fcb->FileObject, &FileOffset, sizeof(FATX_DIR_ENTRY), TRUE, &Context, (PVOID*)&FatXDirEntry))
             {
                 return TRUE;
             }
index a1da379..0e948ad 100644 (file)
@@ -638,7 +638,7 @@ FATDelEntry(
                 CcUnpinData(Context);
             }
             Offset.u.LowPart = (i * sizeof(FAT_DIR_ENTRY) / PAGE_SIZE) * PAGE_SIZE;
-            CcPinRead(pFcb->parentFcb->FileObject, &Offset, PAGE_SIZE, TRUE,
+            CcPinRead(pFcb->parentFcb->FileObject, &Offset, sizeof(FAT_DIR_ENTRY), TRUE,
                       &Context, (PVOID*)&pDirEntry);
         }
         pDirEntry[i % (PAGE_SIZE / sizeof(FAT_DIR_ENTRY))].Filename[0] = 0xe5;
@@ -689,7 +689,7 @@ FATXDelEntry(
     DPRINT("delete entry: %d\n", StartIndex);
     Offset.u.HighPart = 0;
     Offset.u.LowPart = (StartIndex * sizeof(FATX_DIR_ENTRY) / PAGE_SIZE) * PAGE_SIZE;
-    if (!CcPinRead(pFcb->parentFcb->FileObject, &Offset, PAGE_SIZE, TRUE,
+    if (!CcPinRead(pFcb->parentFcb->FileObject, &Offset, sizeof(FATX_DIR_ENTRY), TRUE,
                    &Context, (PVOID*)&pDirEntry))
     {
         DPRINT1("CcPinRead(Offset %x:%x, Length %d) failed\n", Offset.u.HighPart, Offset.u.LowPart, PAGE_SIZE);
index 1bfc51c..bfdeb18 100644 (file)
@@ -474,7 +474,7 @@ vfatMakeFCBFromDirEntry(
        if (vfatFCBIsDirectory(rcFCB))
        {
                ULONG FirstCluster, CurrentCluster;
-               NTSTATUS Status;
+               NTSTATUS Status = STATUS_SUCCESS;
                Size = 0;
                FirstCluster = vfatDirEntryGetFirstCluster (vcb, &rcFCB->entry);
                if (FirstCluster == 1)
@@ -484,7 +484,7 @@ vfatMakeFCBFromDirEntry(
                else if (FirstCluster != 0)
                {
                        CurrentCluster = FirstCluster;
-                       while (CurrentCluster != 0xffffffff)
+                       while (CurrentCluster != 0xffffffff && NT_SUCCESS(Status))
                        {
                                Size += vcb->FatInfo.BytesPerCluster;
                                Status = NextCluster (vcb, FirstCluster, &CurrentCluster, FALSE);
index d91e44f..4a014b3 100644 (file)
@@ -229,7 +229,7 @@ FsdSetFsLabelInformation(PDEVICE_OBJECT DeviceObject,
 
   /* Search existing volume entry on disk */
   FileOffset.QuadPart = 0;
-  if (CcPinRead(pRootFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&Entry))
+  if (CcPinRead(pRootFcb->FileObject, &FileOffset, SizeDirEntry, TRUE, &Context, (PVOID*)&Entry))
   {
     while (TRUE)
     {
@@ -250,13 +250,13 @@ FsdSetFsLabelInformation(PDEVICE_OBJECT DeviceObject,
       Entry = (PDIR_ENTRY)((ULONG_PTR)Entry + SizeDirEntry);
       if ((DirIndex % EntriesPerPage) == 0)
       {
-            CcUnpinData(Context);
-            FileOffset.u.LowPart += PAGE_SIZE;
-            if (!CcPinRead(pRootFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&Entry))
-            {
-              Context = NULL;
-              break;
-            }
+        CcUnpinData(Context);
+        FileOffset.u.LowPart += PAGE_SIZE;
+        if (!CcPinRead(pRootFcb->FileObject, &FileOffset, SizeDirEntry, TRUE, &Context, (PVOID*)&Entry))
+        {
+          Context = NULL;
+          break;
+        }
       }
     }
     if (Context)
index bec9be6..5f2998d 100644 (file)
@@ -1073,7 +1073,7 @@ IopParseDevice(
     IN ULONG Attributes,
     IN OUT PUNICODE_STRING CompleteName,
     IN OUT PUNICODE_STRING RemainingName,
-    IN OUT PVOID Context OPTIONAL,
+    IN OUT PVOID Context,
     IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
     OUT PVOID *Object
 );
index b6a63d9..46060f4 100644 (file)
@@ -171,7 +171,7 @@ IopParseDevice(IN PVOID ParseObject,
                IN ULONG Attributes,
                IN OUT PUNICODE_STRING CompleteName,
                IN OUT PUNICODE_STRING RemainingName,
-               IN OUT PVOID Context OPTIONAL,
+               IN OUT PVOID Context,
                IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
                OUT PVOID *Object)
 {