@@ -31,10 +31,12 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
3131 buffers . Spt . TargetId = 0 ;
3232 buffers . Spt . Lun = 0 ;
3333 buffers . Spt . SenseInfoLength = 24 ;
34+ buffers . Spt . DataIn = 1 ;
3435 buffers . Spt . DataTransferLength = ( uint ) buffers . DataBuf . Length ;
3536 buffers . Spt . TimeOutValue = 2 ;
3637 buffers . Spt . DataBufferOffset = Marshal . OffsetOf ( typeof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS ) , nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) ;
3738 buffers . Spt . SenseInfoOffset = ( uint ) Marshal . OffsetOf ( typeof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS ) , nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . SenseBuf ) ) ;
39+
3840 buffers . Spt . CdbLength = 16 ;
3941 buffers . Spt . Cdb [ 0 ] = 0xB5 ; // SECURITY PROTOCOL IN
4042 buffers . Spt . Cdb [ 1 ] = 0xFE ; // Samsung Protocol
@@ -44,7 +46,7 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
4446 buffers . Spt . DataIn = ( byte ) Kernel32 . SCSI_IOCTL_DATA . SCSI_IOCTL_DATA_OUT ;
4547 buffers . DataBuf [ 0 ] = 1 ;
4648
47- int length = Marshal . SizeOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( ) ;
49+ int length = ( int ) ( Marshal . OffsetOf ( typeof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS ) , nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) . ToInt32 ( ) + buffers . Spt . DataTransferLength ) ;
4850 IntPtr buffer = Marshal . AllocHGlobal ( length ) ;
4951 Marshal . StructureToPtr ( buffers , buffer , false ) ;
5052 bool validTransfer = Kernel32 . DeviceIoControl ( hDevice , Kernel32 . IOCTL . IOCTL_SCSI_PASS_THROUGH , buffer , length , buffer , length , out _ , IntPtr . Zero ) ;
@@ -60,34 +62,35 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
6062 buffers . Spt . Lun = 0 ;
6163 buffers . Spt . SenseInfoLength = 24 ;
6264 buffers . Spt . DataTransferLength = ( uint ) buffers . DataBuf . Length ;
65+ buffers . Spt . DataIn = 1 ;
6366 buffers . Spt . TimeOutValue = 2 ;
6467 buffers . Spt . DataBufferOffset = Marshal . OffsetOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) ;
6568 buffers . Spt . SenseInfoOffset = ( uint ) Marshal . OffsetOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . SenseBuf ) ) ;
69+
6670 buffers . Spt . CdbLength = 16 ;
6771 buffers . Spt . Cdb [ 0 ] = 0xA2 ; // SECURITY PROTOCOL IN
6872 buffers . Spt . Cdb [ 1 ] = 0xFE ; // Samsung Protocol
6973 buffers . Spt . Cdb [ 3 ] = 5 ; // Identify
70- buffers . Spt . Cdb [ 8 ] = 2 ; // Transfer Length (high)
74+ buffers . Spt . Cdb [ 8 ] = 1 ; // Transfer Length (high)
7175 buffers . Spt . Cdb [ 9 ] = 0 ; // Transfer Length (low)
7276 buffers . Spt . DataIn = ( byte ) Kernel32 . SCSI_IOCTL_DATA . SCSI_IOCTL_DATA_IN ;
7377
74- length = Marshal . SizeOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( ) ;
7578 buffer = Marshal . AllocHGlobal ( length ) ;
7679 Marshal . StructureToPtr ( buffers , buffer , false ) ;
7780
7881 validTransfer = Kernel32 . DeviceIoControl ( hDevice , Kernel32 . IOCTL . IOCTL_SCSI_PASS_THROUGH , buffer , length , buffer , length , out _ , IntPtr . Zero ) ;
82+
83+ buffers = Marshal . PtrToStructure < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( buffer ) ;
84+
7985 if ( validTransfer && buffers . DataBuf . Any ( x => x != 0 ) )
8086 {
8187 IntPtr offset = Marshal . OffsetOf < Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS > ( nameof ( Kernel32 . SCSI_PASS_THROUGH_WITH_BUFFERS . DataBuf ) ) ;
8288 IntPtr newPtr = IntPtr . Add ( buffer , offset . ToInt32 ( ) ) ;
8389 data = Marshal . PtrToStructure < Kernel32 . NVME_IDENTIFY_CONTROLLER_DATA > ( newPtr ) ;
84- Marshal . FreeHGlobal ( buffer ) ;
8590 result = true ;
8691 }
87- else
88- {
89- Marshal . FreeHGlobal ( buffer ) ;
90- }
92+
93+ Marshal . FreeHGlobal ( buffer ) ;
9194 }
9295
9396 return result ;
0 commit comments