public unsafe ScanResult(tagFD_SCAN_RESULT source) { Count = source.count; Headers = new tagFD_ID_HEADER[Count]; byte *ptr = source.Header; for (int i = 0; i < Count; i++) { Headers[i] = *(tagFD_ID_HEADER *)ptr; ptr += sizeof(tagFD_ID_HEADER); } }
public static unsafe int ScanTrack(IntPtr driverHandle, int track, UpperSideHead upperSideHead) { tagFD_SEEK_PARAMS seekParams = new tagFD_SEEK_PARAMS() { cyl = (byte)(track >> 1), head = upperSideHead == UpperSideHead.Head1 ? (byte)(track & 1) : (byte)0 }; uint dwRet; DeviceIoControl(driverHandle, IOCTL_FDCMD_SEEK, (IntPtr)(&seekParams), (uint)sizeof(tagFD_SEEK_PARAMS), IntPtr.Zero, 0, out dwRet, IntPtr.Zero); tagFD_SCAN_PARAMS scanParams = new tagFD_SCAN_PARAMS() { Flags = 0, Head = (byte)(track & 1) }; tagFD_SCAN_RESULT scanResult = new tagFD_SCAN_RESULT(); bool r = DeviceIoControl(driverHandle, IOCTL_FD_SCAN_TRACK, (IntPtr)(&scanParams), (uint)sizeof(tagFD_SCAN_PARAMS), (IntPtr)(&scanResult), (uint)sizeof(tagFD_SCAN_RESULT), out dwRet, IntPtr.Zero); int error = !r?Marshal.GetLastWin32Error() : 0; ScanResult scanResultNew = new ScanResult(scanResult); return(error); }