DeviceIoControl
От: Аноним  
Дата: 16.10.03 11:09
Оценка: :)
задача такая:
в DeviceIoControl первым параметром указать дискриптор области памяти.

делаю так

chData = GlobalAlloc (GMEM_ZEROINIT, 20 * 1024);
if (!DeviceIoControl(
        chData,
        IOCTL_FILEDISK_OPEN_MEDIA,
        &open_media_information,
        sizeof(OPEN_MEDIA_INFORMATION),
        NULL,                
        0,                
        &nread,                
        NULL                
        ))


в итоге ошибка номер 6 (инвалидный хэндл).

если в chData загоняю дескриптор файла все работает
chData = CreateFile(...

как мне сделать с памятью???
Re: DeviceIoControl
От: Alexmoon Украина  
Дата: 16.10.03 11:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>задача такая:

А>в DeviceIoControl первым параметром указать дискриптор области памяти.

А>делаю так


А>
А>chData = GlobalAlloc (GMEM_ZEROINIT, 20 * 1024);
А>if (!DeviceIoControl(
А>        chData,
А>        IOCTL_FILEDISK_OPEN_MEDIA,
А>        &open_media_information,
А>        sizeof(OPEN_MEDIA_INFORMATION),
А>        NULL,                
А>        0,                
А>        &nread,                
А>        NULL                
А>        ))
А>


А>в итоге ошибка номер 6 (инвалидный хэндл).


А>если в chData загоняю дескриптор файла все работает

А>chData = CreateFile(...

А>как мне сделать с памятью???




дескрипторы — это описатели, что есть понятие абстрактное и для разных объектов представляет собой совершенно разные вещи.
В МСДН написано что данная функция работает только с дескрипторами полученными при помощи функции CreateFile.

[msdn]
hDevice

[in] Handle to the device on which the operation is to be performed. The device is typically a volume, directory, file, or stream. To retrieve a device handle, use the CreateFile function. For more information, see Remarks.
[/msdn]

какая задача побудила на такие свершения? может уточнение задачи поможет совершенно иной подход найти.
Re: DeviceIoControl
От: Злость Россия  
Дата: 16.10.03 11:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>задача такая:

А>в DeviceIoControl первым параметром указать дискриптор области памяти.

А>делаю так


А>
А>chData = GlobalAlloc (GMEM_ZEROINIT, 20 * 1024);
А>if (!DeviceIoControl(
А>        chData,
А>        IOCTL_FILEDISK_OPEN_MEDIA,
А>        &open_media_information,
А>        sizeof(OPEN_MEDIA_INFORMATION),
А>        NULL,                
А>        0,                
А>        &nread,                
А>        NULL                
А>        ))
А>


А>в итоге ошибка номер 6 (инвалидный хэндл).


Хороший пример не умения читать документацию
DeviceIoControl первым параметром требует handle полученный с помощью CreateFile, как раз для этого GlobalAlloc и возвращает тип HGLOBAL — что-бы думали сначала чем "пихать" куда попало.

А>если в chData загоняю дескриптор файла все работает

А>chData = CreateFile(...

А>как мне сделать с памятью???
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.