Author: janderwald
Date: Wed May  4 23:14:32 2011
New Revision: 51582

URL: http://svn.reactos.org/svn/reactos?rev=51582&view=rev
Log:
[USBSTOR]
- Make DeviceId generation to match ms usbstor
- Don't hardcode the device type in USBSTOR_PdoHandleQueryHardwareId
- Don't hardcode device type in USBSTOR_PdoHandleQueryCompatibleId
- Hackfix generation of instance id
- Add comments
- Cleanup code
- Usbstor now receives ioctl from disk.sys

Modified:
    branches/usb-bringup/drivers/usb/usbstor/pdo.c

Modified: branches/usb-bringup/drivers/usb/usbstor/pdo.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/pdo.c?rev=51582&r1=51581&r2=51582&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/pdo.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/pdo.c [iso-8859-1] Wed May  4 
23:14:32 2011
@@ -80,7 +80,7 @@
     }
 }
 
-LPCWSTR
+LPCSTR
 USBSTOR_GetGenericType(
     IN PUFI_INQUIRY_RESPONSE InquiryData)
 {
@@ -96,7 +96,7 @@
         //
         // FIXME: check if floppy
         //
-        return L"GenDisk";
+        return "GenDisk";
     }
 
     //
@@ -109,42 +109,42 @@
             //
             // sequential device, i.e magnetic tape
             //
-            return L"GenSequential";
+            return "GenSequential";
         }
         case 4:
         {
             //
             // write once device
             //
-            return L"GenWorm";
+            return "GenWorm";
         }
         case 5:
         {
             //
             // CDROM device
             //
-            return L"GenCdRom";
+            return "GenCdRom";
         }
         case 7:
         {
             //
             // optical memory device
             //
-            return L"GenOptical";
+            return "GenOptical";
         }
         case 8:
         {
             //
             // medium change device
             //
-            return L"GenChanger";
+            return "GenChanger";
         }
         default:
         {
             //
             // other device
             //
-            return L"UsbstorOther";
+            return "UsbstorOther";
         }
     }
 }
@@ -252,8 +252,6 @@
     }
 
 }
-
-
 
 
 NTSTATUS
@@ -270,8 +268,6 @@
     ANSI_STRING AnsiString;
     UNICODE_STRING DeviceId;
 
-    DPRINT1("USBSTOR_PdoHandleQueryDeviceId\n");
-
     //
     // get device extension
     //
@@ -300,21 +296,13 @@
     //
     // lets create device string
     //
-    Offset = sprintf(&Buffer[Offset], "USBSTOR\\") + 1;
-
-    //
-    // copy vendor id
-    //
+    Offset = sprintf(&Buffer[Offset], "USBSTOR\\");
+    Offset += sprintf(&Buffer[Offset], DeviceType);
+    Offset += sprintf(&Buffer[Offset], "&Ven_");
     Offset += CopyField(InquiryData->Vendor, &Buffer[Offset], 8);
-
-    //
-    // copy product identifier
-    //
+    Offset += sprintf(&Buffer[Offset], "&Prod_");
     Offset += CopyField(InquiryData->Product, &Buffer[Offset], 16);
-
-    //
-    // copy revision identifer
-    //
+    Offset += sprintf(&Buffer[Offset], "&Rev_");
     Offset += CopyField(InquiryData->Revision, &Buffer[Offset], 4);
 
     //
@@ -374,14 +362,23 @@
     ASSERT(ResultBufferLength);
     ASSERT(ResultBufferLength > ResultBufferOffset);
 
-    DPRINT1("ResultBufferOffset %lu ResultBufferLength %lu Buffer %s Length 
%lu\n", ResultBufferOffset, ResultBufferLength, Buffer, strlen(Buffer));
-
+    DPRINT("ResultBufferOffset %lu ResultBufferLength %lu Buffer %s Length 
%lu\n", ResultBufferOffset, ResultBufferLength, Buffer, strlen(Buffer));
+
+    //
+    // construct destination string
+    //
     DeviceString.Buffer = &ResultBuffer[ResultBufferOffset];
     DeviceString.Length = 0;
     DeviceString.MaximumLength = (ResultBufferLength - ResultBufferOffset) * 
sizeof(WCHAR);
 
+    //
+    // initialize source string
+    //
     RtlInitAnsiString(&AnsiString, Buffer);
 
+    //
+    // convert to unicode
+    //
     Status = RtlAnsiStringToUnicodeString(&DeviceString, &AnsiString, FALSE);
     ASSERT(Status == STATUS_SUCCESS);
 
@@ -406,15 +403,13 @@
 {
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     PFDO_DEVICE_EXTENSION FDODeviceExtension;
-    LPCWSTR GenericType;
+    LPCSTR GenericType, DeviceType;
     LPWSTR Buffer;
     CHAR Id1[50], Id2[50], Id3[50], Id4[50], Id5[50], Id6[50];
     ULONG Id1Length, Id2Length, Id3Length, Id4Length, Id5Length,Id6Length;
     ULONG Offset, TotalLength, Length;
     PUFI_INQUIRY_RESPONSE InquiryData;
 
-    DPRINT1("USBSTOR_PdoHandleQueryHardwareId\n");
-
     //
     // get PDO device extension
     //
@@ -437,9 +432,11 @@
 
 
     //
-    // get generic type
-    //
+    // get device type and generic type
+    //
+    DeviceType = USBSTOR_GetDeviceType(InquiryData);
     GenericType = USBSTOR_GetGenericType(InquiryData);
+
     ASSERT(GenericType);
 
     //
@@ -449,12 +446,12 @@
     RtlZeroMemory(Id1, sizeof(Id1));
     Offset = 0;
     Offset = sprintf(&Id1[Offset], "USBSTOR\\");
-    Offset += sprintf(&Id1[Offset], "Disk"); //FIXME
+    Offset += sprintf(&Id1[Offset], DeviceType);
     Offset += CopyField(InquiryData->Vendor, &Id1[Offset], 8);
     Offset += CopyField(InquiryData->Product, &Id1[Offset], 16);
     Offset += CopyField(InquiryData->Revision, &Id1[Offset], 4);
     Id1Length = strlen(Id1) + 1;
-    DPRINT1("HardwareId1 %s\n", Id1);
+    DPRINT1("USBSTOR_PdoHandleQueryHardwareId HardwareId1 %s\n", Id1);
 
     //
     // generate id 2
@@ -463,11 +460,11 @@
     RtlZeroMemory(Id2, sizeof(Id2));
     Offset = 0;
     Offset = sprintf(&Id2[Offset], "USBSTOR\\");
-    Offset += sprintf(&Id2[Offset], "Disk"); //FIXME
+    Offset += sprintf(&Id2[Offset], DeviceType);
     Offset += CopyField(InquiryData->Vendor, &Id2[Offset], 8);
     Offset += CopyField(InquiryData->Product, &Id2[Offset], 16);
     Id2Length = strlen(Id2) + 1;
-    DPRINT1("HardwareId2 %s\n", Id2);
+    DPRINT1("USBSTOR_PdoHandleQueryHardwareId HardwareId2 %s\n", Id2);
 
     //
     // generate id 3
@@ -476,10 +473,10 @@
     RtlZeroMemory(Id3, sizeof(Id3));
     Offset = 0;
     Offset = sprintf(&Id3[Offset], "USBSTOR\\");
-    Offset += sprintf(&Id3[Offset], "Disk"); //FIXME
+    Offset += sprintf(&Id3[Offset], DeviceType);
     Offset += CopyField(InquiryData->Vendor, &Id3[Offset], 8);
     Id3Length = strlen(Id3) + 1;
-    DPRINT1("HardwareId3 %s\n", Id3);
+    DPRINT1("USBSTOR_PdoHandleQueryHardwareId HardwareId3 %s\n", Id3);
 
     //
     // generate id 4
@@ -488,12 +485,12 @@
     RtlZeroMemory(Id4, sizeof(Id4));
     Offset = 0;
     Offset = sprintf(&Id4[Offset], "USBSTOR\\");
-    Offset += sprintf(&Id4[Offset], "Disk"); //FIXME
+    Offset += sprintf(&Id4[Offset], DeviceType);
     Offset += CopyField(InquiryData->Vendor, &Id4[Offset], 8);
     Offset += CopyField(InquiryData->Product, &Id4[Offset], 16);
     Offset += CopyField(InquiryData->Revision, &Id4[Offset], 1);
     Id4Length = strlen(Id4) + 1;
-    DPRINT1("HardwareId4 %s\n", Id4);
+    DPRINT1("USBSTOR_PdoHandleQueryHardwareId HardwareId4 %s\n", Id4);
 
     //
     // generate id 5
@@ -502,9 +499,9 @@
     RtlZeroMemory(Id5, sizeof(Id5));
     Offset = 0;
     Offset = sprintf(&Id5[Offset], "USBSTOR\\");
-    Offset += sprintf(&Id5[Offset], "GenDisk"); //FIXME
+    Offset += sprintf(&Id5[Offset], GenericType);
     Id5Length = strlen(Id5) + 1;
-    DPRINT1("HardwareId5 %s\n", Id5);
+    DPRINT1("USBSTOR_PdoHandleQueryHardwareId HardwareId5 %s\n", Id5);
 
     //
     // generate id 6
@@ -512,9 +509,9 @@
     //
     RtlZeroMemory(Id6, sizeof(Id6));
     Offset = 0;
-    Offset = sprintf(&Id6[Offset], "GenDisk"); //FIXME
+    Offset = sprintf(&Id6[Offset], GenericType);
     Id6Length = strlen(Id6) + 1;
-    DPRINT1("HardwareId6 %s\n", Id6);
+    DPRINT1("USBSTOR_PdoHandleQueryHardwareId HardwareId6 %s\n", Id6);
 
     //
     // compute total length
@@ -547,7 +544,10 @@
     USBSTOR_ConvertToUnicodeString(Id5, Length, Offset, Buffer, &Offset);
     USBSTOR_ConvertToUnicodeString(Id6, Length, Offset, Buffer, &Offset);
 
-    DPRINT1("Offset %lu Length %lu\n", Offset, Length);
+    //
+    // sanity check
+    //
+    ASSERT(Offset + 1 == Length);
 
     //
     // store result
@@ -567,13 +567,11 @@
 {
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     PFDO_DEVICE_EXTENSION FDODeviceExtension;
-    WCHAR Buffer[100];
-    ULONG Length;
+    CHAR Buffer[100];
+    ULONG Length, Offset;
     LPWSTR InstanceId;
     LPCSTR DeviceType;
 
-    DPRINT1("USBSTOR_PdoHandleQueryCompatibleId\n");
-
     //
     // get PDO device extension
     //
@@ -602,22 +600,8 @@
     //
     // format instance id
     //
-    Length = swprintf(Buffer, L"USBSTOR\\%s", L"Disk") + 1;
-    Length += swprintf(&Buffer[Length], L"USBSTOR\\%s", L"RAW") + 2;
-
-    //
-    // verify this
-    //
-   // Length += swprintf(&Buffer[Length], L"USBSTOR\\RAW") + 1;
-
-    //Buffer[Length] = UNICODE_NULL;
-    //Buffer[Length+1] = UNICODE_NULL;
-    //Length++;
-
-    //
-    // calculate length
-    //
-
+    Length = sprintf(Buffer, L"USBSTOR\\%s", DeviceType) + 1;
+    Length += sprintf(&Buffer[Length], L"USBSTOR\\%s", L"RAW") + 2;
 
     //
     // allocate instance id
@@ -632,12 +616,10 @@
         return STATUS_INSUFFICIENT_RESOURCES;
     }
  
-    //
-    // copy instance id
-    //
-    wcscpy(InstanceId, Buffer);
-
-    DPRINT1("USBSTOR_PdoHandleQueryInstanceId %S\n", InstanceId);
+    USBSTOR_ConvertToUnicodeString(Buffer, Length, 0, InstanceId, &Offset);
+    USBSTOR_ConvertToUnicodeString(&Buffer[Offset], Length, Offset, 
InstanceId, &Offset);
+
+    DPRINT1("USBSTOR_PdoHandleQueryCompatibleId %S\n", InstanceId);
 
     //
     // store result
@@ -656,32 +638,20 @@
     IN OUT PIRP Irp)
 {
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
-    PFDO_DEVICE_EXTENSION FDODeviceExtension;
     WCHAR Buffer[100];
     ULONG Length;
     LPWSTR InstanceId;
 
-    DPRINT1("USBSTOR_PdoHandleQueryInstanceId\n");
-
     //
     // get PDO device extension
     //
     PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
     //
-    // get FDO device extension
-    //
-    FDODeviceExtension = 
(PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
-
-    //
-    // sanity check
-    //
-    ASSERT(FDODeviceExtension->DeviceDescriptor);
-
-    //
     // format instance id
-    //
-    swprintf(Buffer, L"USB\\VID_%04x&PID_%04x\\%s", 
FDODeviceExtension->DeviceDescriptor->idVendor, 
FDODeviceExtension->DeviceDescriptor->idProduct, L"09188212515A");
+    // FIXME: retrieve serial number from string device descriptor
+    //
+    swprintf(Buffer, L"%s&%d", L"09188212515A", PDODeviceExtension->LUN);
 
     //
     // calculate length
@@ -927,7 +897,7 @@
     //
     // create child device object
     //
-    Status = IoCreateDevice(DeviceObject->DriverObject, 
sizeof(PDO_DEVICE_EXTENSION), NULL, FILE_DEVICE_MASS_STORAGE, 
FILE_AUTOGENERATED_DEVICE_NAME, FALSE, &PDO);
+    Status = IoCreateDevice(DeviceObject->DriverObject, 
sizeof(PDO_DEVICE_EXTENSION), NULL, FILE_DEVICE_MASS_STORAGE, 
FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN, FALSE, &PDO);
     if (!NT_SUCCESS(Status))
     {
         //


Reply via email to