Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
1

Хочу именованный virtual

12.10.2015, 19:31. Показов 1266. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
WinAPI InitSecurityInterface() возвращает указатель на структуру, где почти каждое поле - указатель на функцию. Теперь мне надо вызвать одну из этих функций. Например, EncryptMessage(). Я пишу:
Assembler
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
27
28
29
30
31
32
33
virtual at rax
  security_interface.dwVersion                  dq
  security_interface.EnumerateSecurityPackages  dq
  security_interface.QueryCredentialsAttributes dq
  security_interface.AcquireCredentialsHandle   dq
  security_interface.FreeCredentialsHandle      dq
  security_interface.Reserved2                  dq
  security_interface.InitializeSecurityContext  dq
  security_interface.AcceptSecurityContext      dq
  security_interface.CompleteAuthToken          dq
  security_interface.DeleteSecurityContext      dq
  security_interface.ApplyControlToken          dq
  security_interface.QueryContextAttributes     dq
  security_interface.ImpersonateSecurityContext dq
  security_interface.RevertSecurityContext      dq
  security_interface.MakeSignature              dq
  security_interface.VerifySignature            dq
  security_interface.FreeContextBuffer          dq
  security_interface.QuerySecurityPackageInfo   dq
  security_interface.Reserved3                  dq
  security_interface.Reserved4                  dq
  security_interface.ExportSecurityContext      dq
  security_interface.ImportSecurityContext      dq
  security_interface.AddCredentials             dq
  security_interface.Reserved8                  dq
  security_interface.QuerySecurityContextToken  dq
  security_interface.EncryptMessage             dq
  security_interface.DecryptMessage             dq
  security_interface.SetContextAttributes       dq
  security_interface.SetCredentialsAttributes   dq
  security_interface.ChangeAccountPassword      dq
end virtual
call [security_interface.EncryptMessage]
Работает. Когда-нибудь мне понадобится вызвать еще какую-то функцию из структуры. Поэтому до вызова EncryptMessage сохраняю указатель на структуру в памяти:
Assembler
1
2
security_interface dq ?
mov [security_interface], rax
Теперь, чтобы вызвать другую функцию, я должен писать virtual at security_interface и все поля заново? А если потом снова понадобится какое-то поле, но так случится, что указатель на структуру уже будет в регистре RDX, то для оптимизации кода придется писать virtual at rdx и все поля уже в третий раз?
В MASM достаточно было бы написать call (SECURITY_FUNCTION_TABLE ptr [какой_хошь_адрес]).EncriptMessage, единожды описав структуру SECURITY_FUNCTION_TABLE. Очевидно, что должен быть красивый способ решения задачи и в FASM, но я его не знаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2015, 19:31
Ответы с готовыми решениями:

Почему ДВССЫЛ на простой именованный диапазон работает, а на динамический именованный не работает?
Т.е. если создать список, который будет получать данные из именованного диапазона с фиксированным...

Именованный не именованный каналы
Есть програмулина, как её через каналы пустить?? клиенская часть #include <stdio.h>...

Protected abstract virtual base pure virtual private destructor
Хай, all) Вопрос не для начинающих и дурацкий) В разделе для экспертов публиковать не стал, чтобы...

Именованный диапазон
Как кодом увеличить именованный диапазон на одну строку ?

9
Эксперт быдлокодинга
2093 / 527 / 70
Регистрация: 04.11.2010
Сообщений: 1,313
14.10.2015, 15:52 2
Разве нельзя создать структуру и указать её при вызове InitSecurityInterface, а после пользовать её когда понадобится?
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
15.10.2015, 18:18  [ТС] 3
InitSecurityInterface возвращает лишь указатель на структуру.
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
15.10.2015, 21:00 4
mytilus, перемести ее себе в дату.
0
Эксперт быдлокодинга
2093 / 527 / 70
Регистрация: 04.11.2010
Сообщений: 1,313
15.10.2015, 21:45 5
Мотороллер, если верить https://msdn.microsoft.com у этой функции нет параметров. Т.е. как я понимаю повлиять на адрес структуры в принципе нельзя. Но тогда мне становится непонятным вот это
Цитата Сообщение от mytilus Посмотреть сообщение
В MASM достаточно было бы написать call (SECURITY_FUNCTION_TABLE ptr [какой_хошь_адрес]).EncriptMessage, единожды описав структуру SECURITY_FUNCTION_TABLE.
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
15.10.2015, 21:55  [ТС] 6
Ну, смотрите. Получил я, значит, этот указатель. Он сейчас в регистре RAX. Я сохраняю его в data на будущее. И в этом будущем я буду читать указатель из data. Но сейчас он в RAX, и для скорости я обращаюсь к полю структуры не data+offset, а RAX+offset. То есть мне нужно два virtual - at rax сейчас и at data в будущем. Или я что-то не догоняю (просто на FASM перешел буквально на днях)?
0
Эксперт быдлокодинга
2093 / 527 / 70
Регистрация: 04.11.2010
Сообщений: 1,313
15.10.2015, 22:00 7
mytilus, ну я вообще сварщик программист не настоящий (см. ник) если всё в скорость упирается, то почему нельзя просто взять какой нибудбь r15 и юзать его вместо rax. Функции его вроде как не трогают, во всяком случае те с какими я работаю.
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
16.10.2015, 01:11  [ТС] 8
В регистре хранить не получится, хотя очень хотелось бы. Мне к этой структуре нужен доступ из других потоков.
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
16.10.2015, 08:53 9
mytilus, дак я же пишу - переместите себе структуру в дату.
Assembler
1
2
3
4
5
6
invoke [Ваша_функция]
;на выходе в rax какая-то херь
mov rsi, rax
mov rdi, такая_же_структура_как_в_rax_только_в_сегменте_данных
mov rcx, размер_структуры
rep movsb
Добавлено через 34 секунды
а потом вызывать функции из нее как
Assembler
1
call [такая_же_структура_как_в_rax_только_в_сегменте_данных.нужная_функция]
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
16.10.2015, 18:57  [ТС] 10
Мотороллер, я Вашу идею понял. Но есть один маленький нюанс. Если я пишу на asm, то беру на себя обязательства по наиполнейшей оптимизации кода. Все-таки конечный результат должен выглядеть так:
Assembler
1
2
3
4
5
6
call [InitSecurityInterface]
mov  [адрес], rax
; первый вызов функции из структуры:
call qword ptr [rax+смещение]
; второй вызов:
call [адрес+смещение]
Добавлено через 15 минут
Хотя... Сейчас посмотрел на свой код и понял, что
Assembler
1
call qword ptr [адрес+смещение]
с точки зрения оптимизации лучше, чем
Assembler
1
call qword ptr [rax+смещение]
Так что, наверное, мой вопрос решился.

Добавлено через 4 часа 34 минуты
Нет! Я уже сам запутался в том, что мне нужно. А нужно, чтобы было так:
Assembler
1
2
3
4
5
6
7
call [InitSecurityInterface]
mov  [myVar], rax
; первый вызов функции из структуры:
call qword ptr [rax+смещение]
; второй вызов:
mov rax, [myVar]
call qword ptr [rax+смещение]
В общем, опишу virtual at rax, и будет мне счастье.
0
16.10.2015, 18:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2015, 18:57
Помогаю со студенческими работами здесь

Записать в именованный канал
Выполняю следующую команду в консоли: mkfifo mypipe Затем вторую команду: echo 'first' > mypipe...

Именованный конструктор + inline
Приветствую, Форумчане! Следующий код, оформленный в одном файле работает на ура. class Point2...

Именованный каналы (FIFO)
Здравствуйте, хотел бы спросить у знатоков, нет ли готовой библиотеки для работы с именованными...

Чат через именованный Pipe
Привет всем. Написал чат который запускается из двух файлов на одном компьютере. Все делал через...


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

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