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

Структура unicode_string - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
locm
1899 / 654 / 64
Регистрация: 28.10.2011
Сообщений: 1,977
Записей в блоге: 2
13.06.2012, 21:11     Структура unicode_string #1
Помогите разобраться со структурой UNICODE_STRING. Вот ее код:
C
1
2
3
4
5
6
7
8
typedef struct _LSA_UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
#ifdef MIDL_PASS
    [size_is(MaximumLength/2), length_is(Length/2)]
#endif // MIDL_PASS
    PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
Нужно переписать ее на другой язык программирования и с этим есть проблемы.

1. Что за константа MIDL_PASS и в каких случаях она будет присутствовать в коде?
2. Как понять строку [size_is(MaximumLength/2), length_is(Length/2)]?

Гугл не помог мне в этом вопросе.

Добавлено через 5 минут
Есть так же такая разновидность структуры:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct _UNICODE_STRING {
 
 USHORT Length;
 
 USHORT MaximumLength;
 
#ifdef MIDL_PASS
 
 [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
 
#else // MIDL_PASS
 
 PWSTR Buffer;
 
#endif // MIDL_PASS
 
} UNICODE_STRING;
Какая из них правильная, хз.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 21:11     Структура unicode_string
Посмотрите здесь:

C++ Структура
C++ Структура
C++ структура
C++ Отсортировать массив структур по фамилии или по году
C++ структура
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.06.2012, 21:18     Структура unicode_string #2
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
ну т.е. MIDL_PASS определена, когда файл обрабатывается специальным компилятором.
MIDL это наверно Microsoft Interface Definition Language или что-то похожее. На код под этим макросом думаю можно забить и рассматривать эту структуру как описано тут:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.06.2012, 21:23     Структура unicode_string #3
смешно..
это вообще описание COM-структуры
тут нужно курить эти атрибуты
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
я честно говоря никогда не пользовался такими атрибутами
locm
1899 / 654 / 64
Регистрация: 28.10.2011
Сообщений: 1,977
Записей в блоге: 2
13.06.2012, 21:40  [ТС]     Структура unicode_string #4
Ладно. На самом деле проблема не то что в этой структуре, просто думал может из-за этого блока условной компиляции.
Мы имеем структуру DRIVER_OBJECT.
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
typedef struct _DRIVER_OBJECT { 
     CSHORT Type; 
     CSHORT Size; 
 
     PDEVICE_OBJECT DeviceObject; 
     ULONG Flags; 
 
     PVOID DriverStart; 
     ULONG DriverSize; 
     PVOID DriverSection; 
     PDRIVER_EXTENSION DriverExtension; 
 
     UNICODE_STRING DriverName; 
 
     PUNICODE_STRING HardwareDatabase; 
 
     PFAST_IO_DISPATCH FastIoDispatch;
 
     PDRIVER_INITIALIZE DriverInit; 
     PDRIVER_STARTIO DriverStartIo; 
     PDRIVER_UNLOAD DriverUnload; 
     PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; 
 
 } DRIVER_OBJECT;
Я эту структуру в месте с UNICODE_STRING перевел на другой ЯП.
При компиляции под x86 систему все работает нормально, но на x64 системе - баги!
Похоже что вся проблема в типах переменных, точнее занимаемой ими памяти.
Я правильно понимаю что поля типа CSHORT занимают 2 байта независимо от разрядности ОС.
Поля, типа ULONG занимают 4 байта независимо от разрядности ОС.
Поля, начинающиеся с P являются указателями и занимают 4 байта в x86 и 8 байт в x64.

У меня получилось что в 32 битном коде, размер структуры равен 168 байт, а в 64-битном коде - 320 байт.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.06.2012, 22:02     Структура unicode_string #5
Цитата Сообщение от locm Посмотреть сообщение
Поля, типа ULONG занимают 4 байта независимо от разрядности ОС.
long в 64-битных *NIX-системах 8 байт занимает. В 64-битной винде вроде бы 4, но кто их, мелкомягких разберёт?..
Yandex
Объявления
13.06.2012, 22:02     Структура unicode_string
Ответ Создать тему
Опции темы

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