Родилась такая идейка из темы: http://www.wasm.ru/forum/viewtopic.php?id=36924 Думаю сделать программу, в которой можно будет задать формат структуры в виде: <имя поля> - <тип поля> - <комментарий> Затем, подключившись к процессу, задать диапазон памяти, в котором может лежать данная структура. По нажатию кнопки программа бы считывала диапазон памяти в буфер и затем по заданному смещению в считанном буфере производила подстановку значений в поля структуры. То есть пользователь мог бы глазами пройти весь диапазон и определить, в каком месте находится структура, посмотреть значения ее полей и тд. Вывод в виде таблицы: <имя поля> - <значение> Так же можно добавить и автоматический поиск по типам полей структуры. Ну и канеш обязательно надо добавить возможность сохранения/загрузки набитой структуры в файл, чтобы в дальнейшем можно было бы составить своего рода информационную базу плохо и не очень плохо документированных структур виндовс. Как вам идея? Будет ли данная штуковина полезна, или лучше забить на подобную херню? Есть какие-нить дополнения к выше изложенному функционалу? Кто хочет поучаствовать в этом (проект, если и будет, то будет оупенсорцовый)?
Пока все, что сделал это: 1) Захардкодил типы полей структуры Код (Text): #ifndef _DATATYPES_H_INCLUDED_ #define _DATATYPES_H_INCLUDED_ #include <windows.h> // Простые типы данных #define DATATYPE_POINT 0x00 // Указатель #define DATATYPE_BYTE 0x01 // Байт #define DATATYPE_WORD 0x02 // Слово #define DATATYPE_DWORD 0x03 // Двойное слово #define DATATYPE_QWORD 0x04 // Четверное слово #define DATATYPE_FLOAT 0x05 // Число с плавающей точкой #define DATATYPE_ACHAR 0x06 // ANSI-символ #define DATATYPE_WCHAR 0x07 // UNICODE-символ // Массивы #define DATATYPE_POINT_ARRAY 0x10 // Массив указателей #define DATATYPE_BYTE_ARRAY 0x11 // Массив байт #define DATATYPE_WORD_ARRAY 0x12 // Массив слов #define DATATYPE_DWORD_ARRAY 0x13 // Массив двойных слов #define DATATYPE_QWORD_ARRAY 0x14 // Массив четверных слов #define DATATYPE_FLOAT_ARRAY 0x15 // Массив чисел с плавающей точкой #define DATATYPE_ACHAR_ARRAY 0x16 // Массив ANSI-символов #define DATATYPE_WCHAR_ARRAY 0x17 // Массив UNICODE-символов // Строки #define DATATYPE_ACHAR_STR 0x20 // Строка ANSI-символов (символ окончания строки - 0x00) #define DATATYPE_WCHAR_STR 0x21 // Строка UNICODE-символов (символ окончания строки - 0x0000) // Указатели #define DATATYPE_POINT_PTR 0x30 // Указатель на указатель #define DATATYPE_BYTE_PTR 0x31 // Указатель на байт #define DATATYPE_WORD_PTR 0x32 // Указатель на слово #define DATATYPE_DWORD_PTR 0x33 // Указатель на двойное слово #define DATATYPE_QWORD_PTR 0x34 // Указатель на четверное слово #define DATATYPE_FLOAT_PTR 0x35 // Указатель на число с плавающей точкой #define DATATYPE_ACHAR_PTR 0x36 // Указатель на ANSI-символ #define DATATYPE_WCHAR_PTR 0x37 // Указатель на UNICODE-символ DWORD DataType_GetSize(BYTE DataType, DWORD N); #endif 2) Сделал функцию соответствия размеров полей их хардкоженному типу: Код (Text): //-----------------------------------------------------------------// // Получить размер предопределенного типа данных (одного элемента) // // DataType - индекс типа данных // //-----------------------------------------------------------------// DWORD DataType_GetSize(BYTE DataType) { switch(DataType) { // Простые типы case DATATYPE_POINT: return sizeof(PVOID); case DATATYPE_BYTE: return sizeof(BYTE); case DATATYPE_WORD: return sizeof(WORD); case DATATYPE_DWORD: return sizeof(DWORD); case DATATYPE_QWORD: return sizeof(LONGLONG); case DATATYPE_FLOAT: return sizeof(FLOAT); case DATATYPE_ACHAR: return sizeof(CHAR); case DATATYPE_WCHAR: return sizeof(WCHAR); // Массивы case DATATYPE_POINT_ARRAY: return sizeof(PVOID); case DATATYPE_BYTE_ARRAY: return sizeof(BYTE); case DATATYPE_WORD_ARRAY: return sizeof(WORD); case DATATYPE_DWORD_ARRAY: return sizeof(DWORD); case DATATYPE_QWORD_ARRAY: return sizeof(LONGLONG); case DATATYPE_FLOAT_ARRAY: return sizeof(FLOAT); case DATATYPE_ACHAR_ARRAY: return sizeof(CHAR); case DATATYPE_WCHAR_ARRAY: return sizeof(WCHAR); // Строки case DATATYPE_ACHAR_STR: return sizeof(CHAR); case DATATYPE_WCHAR_STR: return sizeof(WCHAR); // Указатели case DATATYPE_POINT_PTR: return sizeof(PVOID); case DATATYPE_BYTE_PTR: return sizeof(PBYTE); case DATATYPE_WORD_PTR: return sizeof(PWORD); case DATATYPE_DWORD_PTR: return sizeof(PDWORD); case DATATYPE_QWORD_PTR: return sizeof(PLONGLONG); case DATATYPE_FLOAT_PTR: return sizeof(PFLOAT); case DATATYPE_ACHAR_PTR: return sizeof(PCHAR); case DATATYPE_WCHAR_PTR: return sizeof(PWCHAR); // Неверный код default: return 0; } }
Трудно себе представить как это и зачем искать структуры во всей памяти. В предидущем топике я имел ввиду раскрутку стека указателей на структуры, вложенные структуры и т.п. (т.е. которые в виде параметров, передаваемых в ф-ции), т.к. мне лично бы это пригодилось.