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

Ваш аккаунт

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

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

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

как открыть USB как обычный файл

86K
23 декабря 2013 года
mixa-1748
9 / / 10.12.2013
как мне отрыть флешку как обычный файл??

следующий код говорит что "отказано в доступе"

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++;
}

что тут не так?
322
23 декабря 2013 года
sadovoya
757 / / 19.11.2005
Насколько я понимаю серийник читается совсем по-другому для флешек:

Код:
#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;
}
Но мне выдает "запрос не поддеоживается". Либо я что-то напортачил, либо не у всех флешек есть серийник.
86K
23 декабря 2013 года
mixa-1748
9 / / 10.12.2013
я таким образом тоже раньше пытался получить серийник и тоже было "запрос не поддеоживается", хотя серийник у флехи стопудово был. может параметры не те или еще чего..
6
24 декабря 2013 года
@pixo $oft
3.4K / / 20.09.2006
Ну во-первых, что сразу бросается в глаза, так это

Во-вторых, существуют менее извращённые способы получения серийных номеров, а именно — GetVolumeInformation.
322
24 декабря 2013 года
sadovoya
757 / / 19.11.2005
Я то надеялся получить серийник продукта. Не знаю только, правильно ли. А 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.

86K
24 декабря 2013 года
mixa-1748
9 / / 10.12.2013
снизойди друг, скинь пример!
443
24 декабря 2013 года
Meander
487 / / 04.09.2011
ёптить
322
24 декабря 2013 года
sadovoya
757 / / 19.11.2005
Код:
#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;
}

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

Ваш ответ

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