Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
dmorozov1997
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 15
#1

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

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

При создании проекции флэш-накопителя, функция возвращает 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2016, 13:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CreateFileMapping: ошибка с кодом 87 при создании проекции флэш-накопителя (C++ WinAPI):

CreateFileMapping ошибка в CopyMemory - C++ WinAPI
Жалуестя на 1>c:\users\сергей\documents\visual studio 2010\projects\lab2\lab2\lab2.cpp(45): error C2664: strlen: невозможно преобразовать...

Ошибка при создании COM порта - C++ WinAPI
Помогите, пожалуйста! При создании сом-порта с помощью функции CreateFile HANDLE hPort; hPort=CreateFile("COM1",...

Ошибка при создании окна - C++ WinAPI
При компиляции не получается создать окно,не опйму где ошибка,программа прост и подобные я уже писал,так что никаких предположений нет ...

Ошибка при создании кнопки - C++ WinAPI
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (msg) { ...

Ошибка при создании кнопки - C++ WinAPI
#include <windows.h> #define IDC_MAIN_BUTTON 101 /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT,...

Ошибка № 5 при создании процесса - C++ WinAPI
Здравствуйте. Приложение запущенное командой CreateProcess выдает ошибку 5. Приложение вызывающее команду CreateProcess запускается в...

3
Убежденный
Ушел с форума
Эксперт С++
15794 / 7231 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
18.11.2016, 14:40 #2
Наверное, никто не пробовал мапить целый том вместо файла.
Ты уверен, что такой сценарий вообще поддерживается CreateFileMapping?
0
dmorozov1997
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 15
18.11.2016, 21:50  [ТС] #3
Если преподаватель сказал, что можно спроецировать том, значит можно.
0
Убежденный
Ушел с форума
Эксперт С++
15794 / 7231 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2016, 10:21
Привет! Вот еще темы с ответами:

Ошибка при создании MessageBox - C++ WinAPI
Добрый день, подскажите пожалуйста #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR...

Ошибка линковки при создании спина - C++ WinAPI
при компилировании выдает ошибку: Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ __imp__CreateUpDownControl@48 в функции...

Ошибка при создании окна сообщений - C++ WinAPI
void Cprogr1Dlg::OnBnClickedButton1() { MessageBox("Привет!"); } Подчеркивает "Привет!", и выводит ошибку: Error:...

Ошибка при создании окна в Windows 10 - C++ WinAPI
В общем, написал я программку, на windows 7 она работает прекрасно, но на windows 10 не создается окно (код попадает в блок с ошибкой),...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru