Форум программистов, компьютерный форум CyberForum.ru

как вызвать createfile ассемблерной вставкой? - C++

Восстановить пароль Регистрация
 
оскар топотушка
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 15
01.05.2011, 13:31     как вызвать createfile ассемблерной вставкой? #1
нужно открыть устройство с помощью createfile ассемблерной вставкой, пока ничего не вышло решил попробовать просто создать пустой файл:
C++
1
2
3
const char *path = "D:\\file.txt";
DWORD ReadWrite = GENERIC_READ | GENERIC_WRITE;
CreateFile(path,ReadWrite,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,0);
вот аналогичная ассемблерная вставка:

Assembler
1
2
3
4
5
6
7
8
9
10
11
_asm
{
push 0
push FILE_ATTRIBUTE_NORMAL
push OPEN_ALWAYS
push NULL
push FILE_SHARE_READ
push ReadWrite
push [a]
call CreateFile
}
но на строчке CreateFile все почему-то валится (Необработанное исключение в "0x00c15838" в "rocket.exe": 0xC0000005: Access violation.)

подскажите где ошибка, пожалуйста
ps создал такую же тему в разделе visual c++..прошу прощения за флуд, но там народу совсем нету, а я немного тороплюсь(
 Комментарий модератора 
Перед тем как создавать тему, надо прочитать правила:
п. 3.4: Запрещено размещать тему в нескольких разделах одновременно (кросспостинг), а также дублировать тему в одном разделе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2011, 13:31     как вызвать createfile ассемблерной вставкой?
Посмотрите здесь:

C++ CreateFile()
функция readfile и createfile C++
Не работает программа с ассемблерной вставкой C++
C++ Непонятки в ассемблерной вставке
CreateFile() и потоки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.05.2011, 13:38     как вызвать createfile ассемблерной вставкой? #2
А ты виндовский заголовок подключил?
оскар топотушка
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 15
01.05.2011, 13:43  [ТС]     как вызвать createfile ассемблерной вставкой? #3
а какой именно нужен?
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.05.2011, 13:49     как вызвать createfile ассемблерной вставкой? #4
Цитата Сообщение от оскар топотушка Посмотреть сообщение
а какой именно нужен?
Скорее всего windows.h.
оскар топотушка
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 15
01.05.2011, 13:53  [ТС]     как вызвать createfile ассемблерной вставкой? #5
да нет, не помогло..а вообще оно в winbase лежит.
все нормально работает если просто CreateFile(path,ReadWrite,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,0); вызвать
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.05.2011, 13:55     как вызвать createfile ассемблерной вставкой? #6
Еще очень может зависеть от режимов сборки. Одно дело - статическая линковка, другое - динамическая с dll. Тут я опыта не имею, но посмотри в режимах линковки проекта что стоит.
Постарайся добиться статической линковки, ибо dll - отдельная морока...
оскар топотушка
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 15
01.05.2011, 14:01  [ТС]     как вызвать createfile ассемблерной вставкой? #7
ну, подключал я везде либ-файлы:
#pragma comment(lib, "hid.lib")
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "dinput.lib")
#pragma comment(lib, "strsafe.lib")
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.05.2011, 14:15     как вызвать createfile ассемблерной вставкой? #8
В свойствах проекта посмотри, а не в тексте проги.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
01.05.2011, 17:38     как вызвать createfile ассемблерной вставкой? #9
Assembler
1
call dword ptr [CreateFileA]
Наверное, еще это потребуется
Assembler
1
mov [hFile], eax
Подгядываем в дизассм код и учимся.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.05.2011, 20:55     как вызвать createfile ассемблерной вставкой? #10
Цитата Сообщение от bigredcat Посмотреть сообщение
Assembler
1
call dword ptr [CreateFileA]
Это синтаксис конкретного компилятора, на некоторых можно вызывать ф-ции так, как в первом посте.
resource2008
 Аватар для resource2008
109 / 109 / 2
Регистрация: 11.03.2011
Сообщений: 421
01.05.2011, 21:50     как вызвать createfile ассемблерной вставкой? #11
в masm-е это может так выглядеть

Assembler
1
2
3
invoke CreateFile, addr filename, GENERIC_READ, NULL, NULL, 3, 1h, NULL ;открытие сэмпл-файла
cmp eax,INVALID_HANDLE_VALUE
je er1
вставленные параметры - не правило, просто кусок кода из существующего проекта.
вторая строка - проверка на наличие ошибки
третья - условный переход на метку er1 - обработчик ошибки
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.05.2011, 06:53     как вызвать createfile ассемблерной вставкой? #12
Цитата Сообщение от resource2008 Посмотреть сообщение
в masm-е это может так выглядеть
Так можно делать в MASM32, это IDE для asm'а, разработанная человеком с ником Hutch, позже к нему присоеденился Iczelion (вроде правильно написал). Они сделали возможным использовать invoke и даже конструкцию IF-THEN-ELSE и WHILE

Добавлено через 3 минуты

Не по теме:

Хотя я не проверял, работает ли это в простом MASM'e, но вроде все таки нет.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2011, 15:39     как вызвать createfile ассемблерной вставкой?
Еще ссылки по теме:

Как правильно вставлять диррективу .386 в ассемблерной вставке C++
Выполнить с использованием ассемблерной вставки C++
C++ Как написать программу на C++ с ассемблерной вставкой?

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

Или воспользуйтесь поиском по форуму:
оскар топотушка
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 15
02.05.2011, 15:39  [ТС]     как вызвать createfile ассемблерной вставкой? #13
call dword ptr [CreateFileA] так не подходит.. пришлось создавать неявную ф-цию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOL (__stdcall *p)(HANDLE ,LPVOID ,DWORD ,LPDWORD ,LPOVERLAPPED);
        p = ::ReadFile;// неявная ф-ция для вызова
 
    _asm{
     mov         esi,esp  
     push        0  
     lea         eax,[bytesRead]  
     push        eax  
     mov         ecx,dword ptr [HidDevice]  
     movzx       edx,word ptr [ecx+20h]  
     push        edx  
     mov         eax,dword ptr [HidDevice]  
     mov         ecx,dword ptr [eax+68h]  
     push        ecx  
     mov         edx,dword ptr [HidDevice]  
     mov         eax,dword ptr [edx+4]  
     push        eax  
     call        [p]
     mov         dword ptr [b],eax 
    }
спасибо за подсказки
правда я сам не понял почему нужно делать именно так... если кто-то сможет объяснить был бы очень признателен
Yandex
Объявления
02.05.2011, 15:39     как вызвать createfile ассемблерной вставкой?
Ответ Создать тему
Опции темы

Текущее время: 22:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru