как открыть USB как обычный файл
следующий код говорит что "отказано в доступе"
H =CreateFile(buf, 0,FILE_SHARE_READ , NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); // открыть диск как файл и прочитать из начала серийник
char sim;
DWORD buf_3;
int u=1;
while (u<50)
{
if(ReadFile(H, &sim,sizeof(sim),&buf_3,NULL))
{
ShowMessage("1111");
Memo1->Lines->Add(sim);
}
else
{
Memo1->Lines->Add(SysErrorMessage(GetLastError()));
}
u++;
}
что тут не так?
Код:
#include <windows.h>
#include <WinIoCtl.h>
#include <cstring>
#include <clocale>
#include <cstdio>
int main() {
setlocale(LC_ALL, "");
printf("Буква флешки (I, H и т.п.): ");
char str[40];
strcpy(str, "\\\\.\\");
char let[2];
scanf("%s", let);
strcat(str, let);
strcat(str, ":");
printf("%s\n", str);
HANDLE H1 = CreateFileA(str,
0,//GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL,
NULL);//0);
if (INVALID_HANDLE_VALUE == H1) {
printf("Error handle\n");
return -300;
}
DWORD ReturnedBytes;
typedef struct _MEDIA_SERIAL_NUMBER_DATA {
ULONG SerialNumberLength;
ULONG Result;
ULONG Reserved[2];
UCHAR SerialNumberData[];
} MEDIA_SERIAL_NUMBER_DATA;
MEDIA_SERIAL_NUMBER_DATA buf;
#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
if(DeviceIoControl(H1,
IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,
NULL, 0, &buf, sizeof(MEDIA_SERIAL_NUMBER_DATA),
&ReturnedBytes, NULL))
printf("%s\n", buf.SerialNumberData);
else{
DWORD er_code = GetLastError();
printf("%lu байт вернула ф-ция\n", ReturnedBytes);
printf("Ошибка: %#lX", er_code);
if(er_code == 50)
printf(" (запрос не поддерживается)\n");
}
if(!CloseHandle(H1)) //тут не обязательно
return -400;
return 0;
}
#include <WinIoCtl.h>
#include <cstring>
#include <clocale>
#include <cstdio>
int main() {
setlocale(LC_ALL, "");
printf("Буква флешки (I, H и т.п.): ");
char str[40];
strcpy(str, "\\\\.\\");
char let[2];
scanf("%s", let);
strcat(str, let);
strcat(str, ":");
printf("%s\n", str);
HANDLE H1 = CreateFileA(str,
0,//GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL,
NULL);//0);
if (INVALID_HANDLE_VALUE == H1) {
printf("Error handle\n");
return -300;
}
DWORD ReturnedBytes;
typedef struct _MEDIA_SERIAL_NUMBER_DATA {
ULONG SerialNumberLength;
ULONG Result;
ULONG Reserved[2];
UCHAR SerialNumberData[];
} MEDIA_SERIAL_NUMBER_DATA;
MEDIA_SERIAL_NUMBER_DATA buf;
#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
if(DeviceIoControl(H1,
IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,
NULL, 0, &buf, sizeof(MEDIA_SERIAL_NUMBER_DATA),
&ReturnedBytes, NULL))
printf("%s\n", buf.SerialNumberData);
else{
DWORD er_code = GetLastError();
printf("%lu байт вернула ф-ция\n", ReturnedBytes);
printf("Ошибка: %#lX", er_code);
if(er_code == 50)
printf(" (запрос не поддерживается)\n");
}
if(!CloseHandle(H1)) //тут не обязательно
return -400;
return 0;
}
я таким образом тоже раньше пытался получить серийник и тоже было "запрос не поддеоживается", хотя серийник у флехи стопудово был. может параметры не те или еще чего..
Во-вторых, существуют менее извращённые способы получения серийных номеров, а именно — GetVolumeInformation.
This function returns the volume serial number that the operating system assigns when a hard disk is formatted.
Но, за ссылку -- спасибо. Там ниже и решение подсказано:
To programmatically obtain the hard disk's serial number that the manufacturer assigns, use the Windows Management Instrumentation (WMI) Win32_PhysicalMedia property SerialNumber.
Можно попробовать через WMI.
снизойди друг, скинь пример!
ёптить
Код:
#include <windows.h>
#include <cstring>
#include <clocale>
#include <cstdio>
int main() {
setlocale(LC_ALL, "");
printf("Буква диска (I, H и т.п.): ");
char let[2];
scanf("%s", let);
char str[40];
strcpy(str, let);
strcat(str, ":\\");
DWORD VolumeSerial = 0;
if(!GetVolumeInformationA(
/*_In_opt_ LPCTSTR */ str,
/*_Out_opt_ LPTSTR */ NULL,
/*_In_ DWORD */ 0,
/*_Out_opt_ LPDWORD */ &VolumeSerial,
/*_Out_opt_ LPDWORD */ NULL,
/*_Out_opt_ LPDWORD */ NULL,
/*_Out_opt_ LPTSTR */ NULL,
/*_In_ DWORD */ 0))
{
printf("Error: %#lX\n", GetLastError());
return -1000;
}
printf("Serial: %lX\n", VolumeSerial); //в hex без префикса
return 0;
}
#include <cstring>
#include <clocale>
#include <cstdio>
int main() {
setlocale(LC_ALL, "");
printf("Буква диска (I, H и т.п.): ");
char let[2];
scanf("%s", let);
char str[40];
strcpy(str, let);
strcat(str, ":\\");
DWORD VolumeSerial = 0;
if(!GetVolumeInformationA(
/*_In_opt_ LPCTSTR */ str,
/*_Out_opt_ LPTSTR */ NULL,
/*_In_ DWORD */ 0,
/*_Out_opt_ LPDWORD */ &VolumeSerial,
/*_Out_opt_ LPDWORD */ NULL,
/*_Out_opt_ LPDWORD */ NULL,
/*_Out_opt_ LPTSTR */ NULL,
/*_In_ DWORD */ 0))
{
printf("Error: %#lX\n", GetLastError());
return -1000;
}
printf("Serial: %lX\n", VolumeSerial); //в hex без префикса
return 0;
}