Более короткий вариант кода (если я нигде не ошибся): Код (Text): @@: xor ecx, ecx mov eax, offset l@pguid mov dword ptr[eax], offset guid_ mov dword ptr[eax+4], ecx mov dword ptr[eax+8], 8000000C mov byte ptr[eax+8+1], cl and dword ptr[eax+12], 0 add eax, 10h inc cl jnz @b ЗЫ: Я бы с радостью удалил все свои посты, кроме первого, как не имеющие отношения к теме, но это будет нарушением правил, т.к. есть логически связянные с ними посты q_q
S_T_A_S_ К сожалению, результат не поменялся. Код (Text): В целом, алгоритм заполнения массива должен быть таким: 1. 00h - ADDR guid_ 04h - 0 08h - 8000000Ch 0Ch - 0 2. 10h - ADDR guid_ 14h - 1 18h - 8000000Ch + 256 1Ch - 0 3. 20h - ADDR guid_ 24h - 2 28h - 8000000Ch + 256 + 256 2Ch - 0 и т.д. Вот возможный вариант (рабочий): Код (Text): xor ecx, ecx mov eax, offset l@pguid mov ebx, 8000000Ch @@: mov dword ptr[eax], offset guid_ mov dword ptr[eax+4], ecx mov dword ptr[eax+8], ebx and dword ptr[eax+12], 0 add eax, 10h add ebx, 256 inc cl jnz @b
Дополнительно к вопросу: Код (Text): S_BUILD_c_dfDIMouse MACRO .DATA ;DIDATAFORMAT -------------------------------------------------------------- ;dwSize_ dd 6*4 ; 18h ; Размер структуры в байтах ;dwObjSize_ dd 4*4 ; 10h ; Размер структуры DIOBJECTDATAFORMAT ;dwFlags_ dd DIDF_RELAXIS ; или DIDF_ABSAXIS ;dwDataSize_ dd 16 ; Размер пересылаемых данных в байтах ;dwNumObjs_ dd 7 ; Число объектов в массиве rgodf ;rgodf_ dd OFFSET l@pguid2 ; Адрес массива состоящего из структур DIOBJECTDATAFORMAT l@pguid2 dd key1, 0, 00FFFF03h, 0 dd key2, 4, 00FFFF03h, 0 dd key3, 8, 80FFFF03h, 0 dd 0, 12, 00FFFF0Ch, 0 dd 0, 13, 00FFFF0Ch, 0 dd 0, 14, 80FFFF0Ch, 0 dd 0, 15, 80FFFF0Ch, 0 c_dfDIMouse_alt dd 6*4, 4*4, DIDF_RELAXIS, 16, 7, OFFSET l@pguid2 key1 GUID GUID_XAxis key2 GUID GUID_YAxis key3 GUID GUID_ZAxis ENDM Данный макрос имеет смысл, только если не хочеться подключать dxguid.lib. В размере данных выигрыша нет.
Да, код зависает в бесконечном цикле, вечно эти левые ошибки, когда пишу в броузере, метку цикла не там поставил =) алго у меня такое и реализовано, просто я не использую ebx, поскольку и так есть счётчик цикла, изменяющийся по тому же закону. Код (Text): xor ecx, ecx mov eax, offset key_data_format __: mov dword ptr[eax], offset GUID_Key mov dword ptr[eax+4], ecx mov dword ptr[eax+8], 8000000Ch mov byte ptr[eax+8+1], cl and dword ptr[eax+12], 0 add eax, 10h inc cl jnz __
Извините за поднятие древней темы, но кто знает, как выглядела структура c_dfDIKeyboard для dinput древней версии 5.0? Под отладкой я вижу, что расстояние между статусами символов = 1байт и при нажатии на символ на клавиатуре высвечивается старший бит, все остальные =0.
Если смотреть по инклудам от 5 версии, то структура такая же как и у старших версий. Если нужны именно значения которые там лежат, то это только отладчик ибо сама структура описана как extern и при сборке приложения прилинковывается что необходимо автоматом (по моему из dxguid.lib) Если в приложении есть вызов типа такого: SetDataFormat то как раз можно посмотреть что там лежит в этой структуре взять данные оттуда и использовать потом по своему усмотрению.