2015-07-28 5 views
1

Я пишу управляемую оболочку для функции IOCTL_DISK_GET_DRIVE_LAYOUT_EX. Он отлично работает на флеш-накопителе, который я тестировал (используя «\\. \ PHYSICALDRIVE1», чтобы получить дескриптор). Но при вызове \\. \ PHYSICALDRIVE0 (системный диск) функция не работает должным образом, то есть:IOCTL_DISK_GET_DRIVE_LAYOUT_EX вызов никогда не возвращается

В первый раз, когда он вызывается с использованием размера буфера по умолчанию, он возвращает ошибку INSUFFICIENT_BUFFER. Когда буфер автоматически изменяется (используя Marshal.GlobalHRealloc), и функция вызывается снова, она никогда не возвращается.

(я использую действительный дескриптор без каких-либо прав доступа.)

Что может быть проблема?

+0

Является ли диск чистым (об ошибках, сообщаемых Disk Management или 'chkdsk')? Правильно ли он работает в собственном коде (например, C++)? –

+0

Кроме того, на ваших путях не хватает каких-либо '\\' обратных косых черт –

+0

@BenVoigt - вы правы. Я не понимал, что С.О. вытеснял их без спасательного персонажа. Диск в порядке. (Это мой основной диск!) – afuna

ответ

1

Я нашел свою ошибку.

При изменении размера lpOutBuffer для размещения ошибки INSUFFICIENT_BUFFER, я использовал Marshal.ReAllocHGlobal без присваивающей вернулась значения моей lpOutBuffer. ReAllocHGlobal выпускал мой указатель и давал мне новый, который я игнорировал, а это означает, что IOCTL вызывается с помощью указателя с высвобождением/недопустимостью. Я не знаю, почему Windows не выдавала ошибку, но я решил проблему.

(Сначала я пытался увеличить размер буфера по умолчанию, и он работал, то, как я понял, что мои последующие вызовы должны иметь проблемы с буфером/указатель, альт! Теперь все работает.)

Смежные вопросы