@@ -36,10 +36,12 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
3636 buffers . Spt . TargetId = 0 ;
3737 buffers . Spt . Lun = 0 ;
3838 buffers . Spt . SenseInfoLength = 24 ;
39+ buffers . Spt . DataIn = 1 ;
3940 buffers . Spt . DataTransferLength = ( uint ) buffers . DataBuf . Length ;
4041 buffers . Spt . TimeOutValue = 2 ;
4142 buffers . Spt . DataBufferOffset = Marshal . OffsetOf ( typeof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS ) , nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) ;
4243 buffers . Spt . SenseInfoOffset = ( uint ) Marshal . OffsetOf ( typeof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS ) , nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . SenseBuf ) ) ;
44+
4345 buffers . Spt . CdbLength = 16 ;
4446 buffers . Spt . Cdb [ 0 ] = 0xB5 ; // SECURITY PROTOCOL IN
4547 buffers . Spt . Cdb [ 1 ] = 0xFE ; // Samsung Protocol
@@ -49,7 +51,7 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
4951 buffers . Spt . DataIn = ( byte ) Kernel32 . SCSI_IOCTL_DATA . SCSI_IOCTL_DATA_OUT ;
5052 buffers . DataBuf [ 0 ] = 1 ;
5153
52- int length = Marshal . SizeOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( ) ;
54+ int length = ( int ) ( Marshal . OffsetOf ( typeof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS ) , nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) . ToInt32 ( ) + buffers . Spt . DataTransferLength ) ;
5355 IntPtr buffer = Marshal . AllocHGlobal ( length ) ;
5456 Marshal . StructureToPtr ( buffers , buffer , false ) ;
5557 bool validTransfer = Kernel32 . DeviceIoControl ( hDevice , Kernel32 . IOCTL . IOCTL_SCSI_PASS_THROUGH , buffer , length , buffer , length , out _ , IntPtr . Zero ) ;
@@ -65,34 +67,35 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
6567 buffers . Spt . Lun = 0 ;
6668 buffers . Spt . SenseInfoLength = 24 ;
6769 buffers . Spt . DataTransferLength = ( uint ) buffers . DataBuf . Length ;
70+ buffers . Spt . DataIn = 1 ;
6871 buffers . Spt . TimeOutValue = 2 ;
6972 buffers . Spt . DataBufferOffset = Marshal . OffsetOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) ;
7073 buffers . Spt . SenseInfoOffset = ( uint ) Marshal . OffsetOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . SenseBuf ) ) ;
74+
7175 buffers . Spt . CdbLength = 16 ;
7276 buffers . Spt . Cdb [ 0 ] = 0xA2 ; // SECURITY PROTOCOL IN
7377 buffers . Spt . Cdb [ 1 ] = 0xFE ; // Samsung Protocol
7478 buffers . Spt . Cdb [ 3 ] = 5 ; // Identify
75- buffers . Spt . Cdb [ 8 ] = 2 ; // Transfer Length (high)
79+ buffers . Spt . Cdb [ 8 ] = 1 ; // Transfer Length (high)
7680 buffers . Spt . Cdb [ 9 ] = 0 ; // Transfer Length (low)
7781 buffers . Spt . DataIn = ( byte ) Kernel32 . SCSI_IOCTL_DATA . SCSI_IOCTL_DATA_IN ;
7882
79- length = Marshal . SizeOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( ) ;
8083 buffer = Marshal . AllocHGlobal ( length ) ;
8184 Marshal . StructureToPtr ( buffers , buffer , false ) ;
8285
8386 validTransfer = Kernel32 . DeviceIoControl ( hDevice , Kernel32 . IOCTL . IOCTL_SCSI_PASS_THROUGH , buffer , length , buffer , length , out _ , IntPtr . Zero ) ;
87+
88+ buffers = Marshal . PtrToStructure < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( buffer ) ;
89+
8490 if ( validTransfer && buffers . DataBuf . Any ( x => x != 0 ) )
8591 {
8692 IntPtr offset = Marshal . OffsetOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) ;
8793 IntPtr newPtr = IntPtr . Add ( buffer , offset . ToInt32 ( ) ) ;
8894 data = Marshal . PtrToStructure < Kernel32 . NVME_IDENTIFY_CONTROLLER_DATA > ( newPtr ) ;
89- Marshal . FreeHGlobal ( buffer ) ;
9095 result = true ;
9196 }
92- else
93- {
94- Marshal . FreeHGlobal ( buffer ) ;
95- }
97+
98+ Marshal . FreeHGlobal ( buffer ) ;
9699 }
97100
98101 return result ;
0 commit comments