Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 15
1

CreateFileMapping: ошибка с кодом 87 при создании проекции флэш-накопителя

18.11.2016, 13:28. Показов 1522. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При создании проекции флэш-накопителя, функция возвращает NULL. При этом я открываю флэш-накопитель как обычный файл:
C++
1
hFlashDrive = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
Функция открытия отрабатывает отлично.
Далее я передаю хэндл в CreateFileMapping, но оно не создаёт проекцию и возвращает NULL:
C++
1
hMapFile = CreateFileMapping(hFlashDrive, NULL, PAGE_READONLY, 0, 0, NULL);
Я проверил ошибку, выдало 87 - неверный параметр.
Возможно ли вообще таким образом создать проекцию флэшки?
Буду раз за любую помощь.

Добавлено через 14 часов 12 минут
Неужели никто не сталкивался с данной проблемой?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2016, 13:28
Ответы с готовыми решениями:

Неполадки с запуском флэш накопителя
Доброго всем времени суток! У меня последнее время наблюдается одна проблема на П.К: вставляю...

Аппаратный серийный номер флэш накопителя
Здравствуйте! Как можно считать аппаратный серийный номер с флэшки? Функция Getvolumeinformation не...

Ошибка при создании дескриптора окна при динамическом создании кнопок
public Form1() { InitializeComponent(); } int height = 10;...

Ошибка доступа при удалении ярлыков с флеш-накопителя
Кароч,дело такое ,часто у меня бывает вирус на флехе что заменяет папки ярлыками,и создает папку...

3
Ушел с форума
Эксперт С++
16475 / 7438 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.11.2016, 14:40 2
Наверное, никто не пробовал мапить целый том вместо файла.
Ты уверен, что такой сценарий вообще поддерживается CreateFileMapping?
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 15
18.11.2016, 21:50  [ТС] 3
Если преподаватель сказал, что можно спроецировать том, значит можно.
0
Ушел с форума
Эксперт С++
16475 / 7438 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.11.2016, 10:21 4
Видимо, преподаватель ошибся.
Маппинг в Windows работает только с файлами (обычными файлами на диске или
файлом подкачки - pagefile). Если передать в CreateFileMapping/NtCreateSection хэндл
какого-то другого объекта, то функция вернет ошибку.

Я могу даже попробовать объяснить, почему это не работает.

Имя тома, такое как 'C:' или '\\.\C:', на самом деле является просто символьной ссылкой на
соответствующее устройство, например '\Device\HarddiskVolume2'. В этом можно убедиться,
запустив программу WinObj из пакета Sysinternals и поискать букву диска в каталоге 'GLOBAL??'.

Когда вызывается функция CreateFileMapping или ее низкоуровневый аналог Zw(Nt)CreateSection,
она среди прочего проверяет, является ли переданный хэндл файлом, и если нет - возвращает ошибку.
Вот фрагмент известного исходника из Windows Research Kernel:

\base\ntos\mm\createsect.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
NTSTATUS
MmCreateSection (
    __deref_out PVOID *SectionObject,
    __in ACCESS_MASK DesiredAccess,
    __in_opt POBJECT_ATTRIBUTES ObjectAttributes,
    __in PLARGE_INTEGER InputMaximumSize,
    __in WIN32_PROTECTION_MASK SectionPageProtection,
    __in ULONG AllocationAttributes,
    __in_opt HANDLE FileHandle,
    __in_opt PFILE_OBJECT FileObject
    )
{
 
    // ...
    
    Status = ObReferenceObjectByHandle (FileHandle,
                                        FileDesiredAccess,
                                        IoFileObjectType,
                                        PreviousMode,
                                        (PVOID *)&File,
                                        NULL);
    if (!NT_SUCCESS(Status)) {
        return Status;
    }
    
    // ...
Устройство, на которое указывает символьная ссылка тома, имеет другой тип -
IoDeviceObjectType, поэтому ObReferenceObjectByHandle завершается с ошибкой
STATUS_OBJECT_TYPE_MISMATCH и CreateFileMapping/Zw(Nt)CreateSection,
соответственно, тоже.

Ну и в описании функции CreateFileMapping сказано следующее:
Creates or opens a named or unnamed file mapping object for a specified file.
Здесь четко сказано: "file", ни слова про тома, устройства и т.п.
2
19.11.2016, 10:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2016, 10:21
Помогаю со студенческими работами здесь

ffmpeg - ошибка при преобразовании видео в флэш
Добрый день. Подскажите пожалуйста в чем ошибка и как ее исправить? Преобразовываю на компьютере...

CreateFileMapping ошибка в CopyMemory
Жалуестя на 1>c:\users\сергей\documents\visual studio 2010\projects\lab2\lab2\lab2.cpp(45): error...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru