Блокируем и разблокируем USB
Нужен обратный код для включения USB можно по нажатию по второй кнопке
Код:
[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);
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);
это (из MSDN на C/C++).
Видимо
Может я не правильно понял смысл комментария , но kernel32.dll это библиотека функций ядра и не важно на каком языке к ней обращаться ....
http://www.vsokovikov.narod.ru/New_MSDN_API/Menage...
http://www.vsokovikov.narod.ru/New_MSDN_API/Device...
Я нашел описание этих функций и понимаю , что бы написать обратный код включения , нужно поменять значения некоторых переменных и все , но каких и на что пока понять не могу ...
http://www.vsokovikov.narod.ru/New_MSDN_API/Device...
Я нашел описание этих функций и понимаю , что бы написать обратный код включения , нужно поменять значения некоторых переменных и все , но каких и на что пока понять не могу ...
Остальные найдете, думаю, сами в MSDN.
Насчет C/C++ я имел ввиду, что раз вы на шарпе пишите, то не предупредить, что я инфу в сишном синтаксисе даю - вроде не корректно.. Но ссылку дал, потому, что разобраться не сложно с переводом в шарп.
Спасибо за ссылку , весьма полезная информация , но пока я продтвинулся лишь духовно ....
Вы знаете решение или вы просто нашли ссылку на описания этой переменной ???
Это константа, результат раскрытия такого макроса:
Код:
#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
Я вам дал уже готовое значение раскрытия этого макроса. У вас в коде на C# можно так поступить, подобно тому, как для FSCTL_LOCK_VOLUME было :
Код:
const uint FSCTL_UNLOCK_VOLUME = 0x0009001C;
Я понимаю, как написать его на С++, используя ту ссылку на MSDN, которую приводил. Там предельно разжевано. У вас могут быть трудности только с поиском значений именованных констант, которые для С++ уже прописаны в заголовочных файлах в комплектах к компиляторам, а вам надо будет их числовые значения самому искать и вписывать. Если какие-то значения констант не найдете, пишите - помогу. Кстати, неужели в шарпе так глухо с поддержкой API - приходится вручную многое прописывать. Даже не верится. Или эта трудность только для некоторых системных библиотек?
Если вам не затруднит не могли бы вы написать код на плюсах , а его переделаю под себя ...
И вы оказались правы , как раз переменные я и не знаю )
Код:
#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;
}
#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;
}
Код:
const uint FSCTL_UNLOCK_VOLUME = 0x0009001C;
uint byteReturned=0;
DeviceIoControl(ptr, FSCTL_UNLOCK_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, ref byteReturned, IntPtr.Zero);
uint byteReturned=0;
DeviceIoControl(ptr, FSCTL_UNLOCK_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, ref byteReturned, IntPtr.Zero);
P.S. Как видите кроме FSCTL_UNLOCK_VOLUME никаких новых констант и не потребовалось :)