Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6310
Последний выпуск: 19.06.2015

Блокируем и разблокируем USB

87K
04 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
На форуме нашел код блокировки USB :

Нужен обратный код для включения USB можно по нажатию по второй кнопке
87K
04 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
Код:
[DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile);


IntPtr ptr;


[DllImport("kernel32.dll", SetLastError = true)]
static extern bool DeviceIoControl(
    IntPtr hDevice,
    uint dwIoControlCode,
    IntPtr lpInBuffer,
    uint nInBufferSize,
    [Out] IntPtr lpOutBuffer,
    uint nOutBufferSize,
    ref uint lpBytesReturned,
    IntPtr lpOverlapped);



        private void button1_Click(object sender, EventArgs e)
        {
            const uint FILE_SHARE_READ = 0x00000001;
            const uint FILE_SHARE_WRITE = 0x00000002;
            const uint OPEN_EXISTING = 3;
            const uint GENERIC_READ = 0x80000000;
            const uint GENERIC_WRITE = 0x40000000;

            const uint FSCTL_LOCK_VOLUME = 0x00090018;

            string str = @"\.E:";
           
            ptr = CreateFile(str, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
           
            uint byteReturned=0;
            DeviceIoControl(ptr, FSCTL_LOCK_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, ref byteReturned, IntPtr.Zero);
326
04 мая 2015 года
sadovoya
757 / / 19.11.2005
Видимо это (из MSDN на C/C++).
87K
05 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
Может я не правильно понял смысл комментария , но kernel32.dll это библиотека функций ядра и не важно на каком языке к ней обращаться ....
87K
05 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
http://www.vsokovikov.narod.ru/New_MSDN_API/Menage...
http://www.vsokovikov.narod.ru/New_MSDN_API/Device...
Я нашел описание этих функций и понимаю , что бы написать обратный код включения , нужно поменять значения некоторых переменных и все , но каких и на что пока понять не могу ...
326
05 мая 2015 года
sadovoya
757 / / 19.11.2005
FSCTL_UNLOCK_VOLUME имеет 16-ричное значение 0x0009001C.
Остальные найдете, думаю, сами в MSDN.
Насчет C/C++ я имел ввиду, что раз вы на шарпе пишите, то не предупредить, что я инфу в сишном синтаксисе даю - вроде не корректно.. Но ссылку дал, потому, что разобраться не сложно с переводом в шарп.
87K
07 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
Спасибо за ссылку , весьма полезная информация , но пока я продтвинулся лишь духовно ....
87K
07 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
Вы знаете решение или вы просто нашли ссылку на описания этой переменной ???
326
07 мая 2015 года
sadovoya
757 / / 19.11.2005
Цитата:
...или вы просто нашли ссылку на описания этой переменной ???

Это константа, результат раскрытия такого макроса:

 
Код:
#define FSCTL_UNLOCK_VOLUME  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
из заголовочника <ddk/ntifs.h> в MinGW, если вам это интересно.
Я вам дал уже готовое значение раскрытия этого макроса. У вас в коде на C# можно так поступить, подобно тому, как для FSCTL_LOCK_VOLUME было :
 
Код:
const uint FSCTL_UNLOCK_VOLUME = 0x0009001C;
И далее использовать вторым параметром в DeviceIoControl вместо FSCTL_LOCK_VOLUME.
Цитата:
Вы знаете решение...?

Я понимаю, как написать его на С++, используя ту ссылку на MSDN, которую приводил. Там предельно разжевано. У вас могут быть трудности только с поиском значений именованных констант, которые для С++ уже прописаны в заголовочных файлах в комплектах к компиляторам, а вам надо будет их числовые значения самому искать и вписывать. Если какие-то значения констант не найдете, пишите - помогу. Кстати, неужели в шарпе так глухо с поддержкой API - приходится вручную многое прописывать. Даже не верится. Или эта трудность только для некоторых системных библиотек?

87K
08 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
Если вам не затруднит не могли бы вы написать код на плюсах , а его переделаю под себя ...
87K
08 мая 2015 года
ЕвгенийСергеев
8 / / 04.05.2015
И вы оказались правы , как раз переменные я и не знаю )
326
08 мая 2015 года
sadovoya
757 / / 19.11.2005
Код:
#include <windows.h>
#include <WinIoCtl.h>
#include <cstdio>

int main()
{
    //вообще-то вроде надо с direct access, но в Vista его не получишь (см. MSDN)
    //С CDROM и с флешкой сработало и так..
    HANDLE h = CreateFile("\\\\.\\I:",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);
    if ( INVALID_HANDLE_VALUE == h )
        return -1000;

    DWORD tmp;

    if ( !DeviceIoControl(h, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &tmp, NULL) ) {
        printf("Error %X\n", GetLastError());
        return -2000;
    }
    printf("Locked ok. Press any key to unlock...");
    getchar();

    if ( !DeviceIoControl(h, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &tmp, NULL) ) {
        printf("Error %X\n", GetLastError());
        return -3000;
    }
    printf("Unlocked ok. Press any key to exit...");
    getchar();

    CloseHandle(h);//здесь не обязательно
    //Кстати CloseHandle или выход из программы тоже разлочивает

    return 0;
}
326
08 мая 2015 года
sadovoya
757 / / 19.11.2005
Содержание всего вашего обработчика, я так понимаю будет следующее (учитывая, что глобальный ptr у вас и хендл на флешку уже получен и еще не закрыт):
 
Код:
const uint FSCTL_UNLOCK_VOLUME = 0x0009001C;
uint byteReturned=0;
DeviceIoControl(ptr, FSCTL_UNLOCK_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, ref byteReturned, IntPtr.Zero);
Закрытия хендла тоже ведет к разлочанью. Так что можно просто CloseHandle(ptr), если хэндл больше не нужен в программе. В любом случае закрыть хендл надо, когда он больше не нужен, иначе до закрытия программы этот ресурс не освободится.

P.S. Как видите кроме FSCTL_UNLOCK_VOLUME никаких новых констант и не потребовалось :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог