디스크 지오메트리 정보를 가져와야하지만 잘못되어 DeviceIoControl이 false를 반환합니다. 어떤 아이디어로 그것을 고치는 법? 또는 C#과 kernel32를 사용하는 다른 예제가 감사하겠습니다.디스크 지오메트리 정보 얻기
[DllImport("kernel32.dll")]
public static extern IntPtr CreateFile(
string lpFileName, int dwDesiredAccess, int dwShareMode,
IntPtr lpSecurityAttributes, int dwCreationDisposition,
int dwFlagsAndAttributes, IntPtr hTemplateFile);
private const int FILE_SHARE_READ = 1;
private const int OPEN_ALWAYS = 4;
private const int INVALID_HANDLE_VALUE = -1;
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern bool DeviceIoControl(
IntPtr hDevice, int dwIoControlCode, IntPtr lpInBuffer, int nInBufferSize,
IntPtr lpOutBuffer, int nOutBufferSize, ref int lpBytesReturned, IntPtr lpOverlapped);
private const int IOCTL_DISK_GET_MEDIA_TYPES = 0x00070c00;
static void Main(string[] args)
{
IntPtr hflp = CreateFile(@""\\.\C:", 0, FILE_SHARE_READ, IntPtr.Zero, OPEN_ALWAYS, 0, IntPtr.Zero);
if ((int)hflp == INVALID_HANDLE_VALUE)
{ Console.WriteLine("CreateFile failed"); return; }
Type ts = typeof(DISK_GEOMETRY);
int ss = Marshal.SizeOf(ts);
int ssa = ss * 20;
IntPtr mptr = Marshal.AllocHGlobal(ssa);
int byret = 0;
bool ok = DeviceIoControl(hflp, IOCTL_DISK_GET_MEDIA_TYPES, IntPtr.Zero, 0,
mptr, ssa, ref byret, IntPtr.Zero);
if (!ok)
{ Console.WriteLine("DeviceIoControl failed"); return; }
int count = byret/ss;
int run = (int)mptr;
DISK_GEOMETRY gem;
for (int i = 0; i < count; i++)
{
gem = (DISK_GEOMETRY)Marshal.PtrToStructure((IntPtr)run, ts);
Console.WriteLine("MediaType={0} SectorsPerTrack={1}", gem.MediaType, gem.SectorsPerTrack);
run += ss;
}
Marshal.FreeHGlobal(mptr);
}
피씨 나는 이미 이것에 대한 msdn 도움말을 읽었습니다.
당신은 당신이에 MSDN의 문서를 읽을 말했다 경우 ([GetLastError] 한 그래서 뭐 http://msdn.microsoft.com/en-us/library/windows/ desktop/ms679360 (v = vs.85) .aspx) return (_as는 MSDN docs_에서 제안 했습니까?) –
실제로 ERROR_SUCCESS 또는 0을 반환합니다. – jjjojjjooo
그냥 추측 할 수 있지만 설명서에'작업이 실패 *이거나 보류 중 *이면 반환 값은 0입니다. '라고 표시됩니다. 나는 그것이 후자라고 생각할 것이다. –