Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
juline
1 / 1 / 0
Регистрация: 13.06.2010
Сообщений: 51
#1

GetThreadSelectorEntry в .NET - C#

04.09.2011, 02:26. Просмотров 798. Ответов 6
Метки нет (Все метки)

Пытаюсь вызвать GetThreadSelectorEntry в программе на c sharp.

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
25
26
27
28
29
30
31
32
33
34
35
36
        [StructLayout(LayoutKind.Sequential)]
        public struct _LDT_ENTRY
        {
            public uint LimitLow;
            public uint BaseLow;
            public highword HighWord;
        }
 
 
        public struct bytes
        {
            public int BaseMid,
            Flags1,
            Flags2,
            BaseHi;
        }
 
        public struct bits
        {
            public UInt32 BaseMid,
            Type,
            Dpl,
            Pres,
            LimitHi,
            Sys,
            Reserved_0,
            Default_Big,
            Granularity,
            BaseHi;
        }
        
        public struct highword
        {
            public bytes Bytes;
            public bits Bits;
        }
C#
1
2
3
4
5
6
                    context = new WinAPI.CONTEXT();
                    context.ContextFlags = (uint)WinAPI.CONTEXT_FLAGS.CONTEXT_FULL;
                    WinAPI.GetThreadContext((IntPtr)CURThread, ref context);
 
                    WinAPI._LDT_ENTRY ldtEntry = new WinAPI._LDT_ENTRY();
                    WinAPI.GetThreadSelectorEntry((IntPtr)CURThread, context.SegCs, ref ldtEntry);
Нужны:
ldtEntry.HighWord.Bits.Dpl
ldtEntry.HighWord.Bits.Default_Big

Но все дочерние параметры от ldtEntry.HighWord по нулям... Я почти уверен, что структуру не правильно описал, но не пойму, где именно. Пытался различные типы и через различные представления делать, результат один.

Задачу я выполнил, но тут меня терзает(!!) любопытство.
Прошу тыкнуть носом!
P.S. LimitLow и BaseLow получают свои значения, как положено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2011, 02:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос GetThreadSelectorEntry в .NET (C#):

Какие возможны неприятные повороты при переходе с .NET 3.5 на .NET 4.5.1 | - C#
"неприятные повороты" - слово "проблемы" не пропускает валидация Пришлось перевести очень много библиотек и несколько проектов. За...

Как подключить к ConsoleApp(.Net Core) библиотеку (.Net Standart) - C#
Привет товарищи!) Решил чутка по изучать нововведения(ну лично для меня ConsoleApp(.Net Core) и Library (.Net Standart)). Написал...

Использование Sphinx4 jar в .NET через ikvm.net или веб сервисы? - C#
Здравствуйте, Пытвюсь заставить распознаватель речи Sphinx 4 работать в .NET. Пробовал IKVM.NET и веб сервисы. Не одно решение...

Как установить .NET приложение, но без установки самого .NET Framework? - .NET
Мне нужно установить .NET приложение, но без установки самого .NET Framework. Возможно ли это? есть ли способ избежать установки на...

Как указать VS.NET какой из установленный .NET Framewrok SDK использовать - .NET
У меня есть дистрибутив VS.NET2002. При инсталляции он ставит .NET Framewrok SDK v1.0.3705 Я скачал .NET Framewrok SDK v1.1.4322....

Что лучше выбрать VB.NET или C.NET (C#)? - .NET
Я программирую на VB. Но так как сейчас появилась .NET платформа решил перейти на неё. Подскажите что лучше выбрать VB.NET или C.NET...

6
NickoTin
Почетный модератор
Эксперт .NET
8246 / 3528 / 239
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
04.09.2011, 03:46 #2
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
        struct BYTES
        {
            public byte BaseMid;
            public byte Flags1;
            public byte Flags2;
            public byte BaseHi;
        }
 
        struct BITS
        {
            int Value;
            /// <summary>
            /// Max set value is 255 (11111111b)
            /// </summary>
            public int BaseMid {
                get {
                    return ( Value & 0xFF );
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFFFFF00 ) ) | ( value & 0xFF );
                }
            }
            /// <summary>
            /// Max set value is 31 (11111b)
            /// </summary>
            public int Type {
                get {
                    return ( Value & 0x1F00 ) >> 8;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFFFE0FF ) ) | ( ( value & 0x1F ) << 8 );
                }
            }
            /// <summary>
            /// Max set value is 3 (11b)
            /// </summary>
            public int Dpl {
                get {
                    return ( Value & 0x6000 ) >> 13;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFFF9FFF ) ) | ( ( value & 0x3 ) << 13 );
                }
            }
            /// <summary>
            /// Max set value is 1 (1b)
            /// </summary>
            public int Pres {
                get {
                    return ( Value & 0x8000 ) >> 15;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFFF7FFF ) ) | ( ( value & 0x1 ) << 15 );
                }
            }
            /// <summary>
            /// Max set value is 15 (1111b)
            /// </summary>
            public int LimitHi {
                get {
                    return ( Value & 0xF0000 ) >> 16;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFF0FFFF ) ) | ( ( value & 0xF ) << 16 );
                }
            }
            /// <summary>
            /// Max set value is 1 (1b)
            /// </summary>
            public int Sys {
                get {
                    return ( Value & 0x100000 ) >> 20;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFEFFFFF ) ) | ( ( value & 0x1 ) << 20 );
                }
            }
            /// <summary>
            /// Max set value is 1 (1b)
            /// </summary>
            public int Reserved_0 {
                get {
                    return ( Value & 0x200000 ) >> 21;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFDFFFFF ) ) | ( ( value & 0x1 ) << 21 );
                }
            }
            /// <summary>
            /// Max set value is 1 (1b)
            /// </summary>
            public int Default_Big {
                get {
                    return ( Value & 0x400000 ) >> 22;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFBFFFFF ) ) | ( ( value & 0x1 ) << 22 );
                }
            }
            /// <summary>
            /// Max set value is 1 (1b)
            /// </summary>
            public int Granularity {
                get {
                    return ( Value & 0x800000 ) >> 23;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFF7FFFFF ) ) | ( ( value & 0x1 ) << 23 );
                }
            }
            /// <summary>
            /// Max set value is 255 (11111111b)
            /// </summary>
            public int BaseHi {
                get {
                    return ( Value & unchecked( (int)0xFF000000 ) ) >> 24;
                }
                set {
                    Value = ( Value & unchecked( (int)0xFFFFFF ) ) | ( ( value & 0xFF ) << 24 );
                }
            }
        }
 
 
        [StructLayout( LayoutKind.Explicit )]
        struct HIGHWORD
        {
            [FieldOffset( 0 )]
            public BYTES Bytes;
            [FieldOffset( 0 )]
            public BITS Bits;
        }
 
        struct LTD_ENTRY
        {
            public ushort LimitLow;
            public ushort BaseLow;
            public HIGHWORD HighWord;
        }
juline, Вы случаем не отладчик пытаетесь написать? )
1
juline
1 / 1 / 0
Регистрация: 13.06.2010
Сообщений: 51
04.09.2011, 13:31  [ТС] #3
SSTREGG, спасибо, Ваше описание подошло .

C#
1
2
            /// Max set value is 31 (11111b)
            }
Можете объяснить логику? Почему целых 5ть позиций на такое число?
Цитата Сообщение от SSTREGG Посмотреть сообщение
Max set value is 3 (11b)
А вот тут 2.

Цитата Сообщение от SSTREGG Посмотреть сообщение
Value & 0x6000
Цитата Сообщение от SSTREGG Посмотреть сообщение
Value & 0x4000
Почему тут именно эти ячейки выбраны?
0
NickoTin
Почетный модератор
Эксперт .NET
8246 / 3528 / 239
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
04.09.2011, 14:38 #4
Цитата Сообщение от juline Посмотреть сообщение
Можете объяснить логику? Почему целых 5ть позиций на такое число?
Потому что так установлено MS
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 _LDT_ENTRY {
  WORD  LimitLow;
  WORD  BaseLow;
  union {
    struct {
      BYTE BaseMid;
      BYTE Flags1;
      BYTE Flags2;
      BYTE BaseHi;
    } Bytes;
    struct {
      DWORD BaseMid  :8;
      DWORD Type  :5;
      DWORD Dpl  :2;
      DWORD Pres  :1;
      DWORD LimitHi  :4;
      DWORD Sys  :1;
      DWORD Reserved_0  :1;
      DWORD Default_Big  :1;
      DWORD Granularity  :1;
      DWORD BaseHi  :8;
    } Bits;
  } HighWord;
} LDT_ENTRY, *PLDT_ENTRY;
Цитата Сообщение от juline Посмотреть сообщение
Почему тут именно эти ячейки выбраны?
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/// <summary>
/// Max set value is 31 (11111b)
/// </summary>
public int Type {
    get {
        // Нужное нам число находится по смещению 8 бит и длиной 5 бит
        // Value, число длиной 32 бита, таким образом нам нужно выделить
        // наше число из общего набора бит, для этого надо:
        //     Value & 0x1F00 - обнуляем все биты кроме 5 бит, начинающихся
        //     по смещению 8. Пример:
        //      Value = 13622068 | [0000 0000 1100 1111 1101 1011 0011 0100]
        //                       |                  & (BIT AND OP)
        //      0x1F00 = 7936    | [0000 0000 0000 0000 0001 1111 0000 0000]
        //                       |                  =
        //      0x1B00 = 6912    | [0000 0000 0000 0000 0001 1011 0000 0000]
        //      Получаем нужные биты, но они смещены на 8 позиций. Смещаем
        //      их на 8 позиций с помощью >>
        //      0x1B00 = 6912    | [0000 0000 0000 0000 0001 1011 0000 0000]
        //                       |                  >> 8
        //      0x1B = 27        | [0000 0000 0000 0000 0000 0000 0001 1011]    
               
        return ( Value & 0x1F00 ) >> 8;
    }
    set {
        // Теперь задача обратная, нужно обнулить 5 бит по смещению 8 и
        // записать в них новое значение, при этом значение нужно обрезать
        // чтобы не перезаписать крайние биты.
        //      1. Value & unchecked( (int)0xFFFFE0FF )
        //      Value = 13622068         | [0000 0000 1100 1111 1101 1011 0011 0100]
        //                               |                  & (BIT AND OP)
        //      0xFFFFE0FF = 4294959359  | [1111 1111 1111 1111 1110 0000 1111 1111]
        //                               |                  =
        //      0xCFC034 = 13615156      | [0000 0000 1100 1111 1100 0000 0011 0100]
        //      --------------------------------------------------------------------
        //      P.S. 0xFFFFE0FF это число 0x1F00 с инвертированными битами (BIT NOT OP)
        //      ~0x1F00 = 0xFFFFE0FF
        //      --------------------------------------------------------------------
        //      2. ( value & 0x1F ) << 8
        //      value = 156              | [0000 0000 0000 0000 0000 0000 1001 1100]
        //                               |                  & (BIT AND OP)
        //      0x1F = 31                | [0000 0000 0000 0000 0000 0000 0001 1111]
        //                               |                  =
        //      0x1C = 28                | [0000 0000 0000 0000 0000 0000 0001 1100]
        //                               |                  << 8
        //      0x1C00 = 7168            | [0000 0000 0000 0000 0001 1100 0000 0000]
        //      --------------------------------------------------------------------
        //      P.S. 0x1F это максимальное число, которое получится если установлены
        //      все 5 бит.
        //      --------------------------------------------------------------------
        //      3. ( Value & unchecked( (int)0xFFFFE0FF ) ) | ( ( value & 0x1F ) << 8 )
        //      0xCFC034 = 13615156      | [0000 0000 1100 1111 1100 0000 0011 0100]
        //                               |                  | (BIT OR OP)
        //      0x1C00 = 7168            | [0000 0000 0000 0000 0001 1100 0000 0000]
        //                               |                  =
        //      0xCFDC34 = 13622324      | [0000 0000 1100 1111 1101 1100 0011 0100]
        Value = ( Value & unchecked( (int)0xFFFFE0FF ) ) | ( ( value & 0x1F ) << 8 );
    }
}
0
juline
1 / 1 / 0
Регистрация: 13.06.2010
Сообщений: 51
04.09.2011, 16:03  [ТС] #5
Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0xFF );
Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x1F00 ) >> 8;
Здесь вот вполне понятна маска (выбрана по количеству допустимых позиций числа).

Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x6000 ) >> 13;
6?
Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x4000 ) >> 15;
А вот тут? Почему именно такая маска?

Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x100000 ) >> 20;
Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x200000 ) >> 21;
Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x400000 ) >> 22;
Цитата Сообщение от SSTREGG Посмотреть сообщение
return ( Value & 0x800000 ) >> 23;
А тут? Если значения однобитовые, почему нельзя брать 0x100000, 0x200000, 0x300000, 0x400000?

P.S. Такого раньше не делал и хочется понять.
0
NickoTin
Почетный модератор
Эксперт .NET
8246 / 3528 / 239
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
04.09.2011, 16:45 #6
Цитата Сообщение от juline Посмотреть сообщение
Такого раньше не делал и хочется понять.
Если Вы будет просто читать, то что я написал постом выше, то поймёте далеко не всё. Чтобы понять, надо самому подставлять значения и смотреть на результаты.
Я Вам полностью описал алгоритм работы с битами, Ваша задача разобраться в этом. Могу лишь посоветовать посмотреть статьи о булевой алгебре, ну и картинка в помощь, на которой показано размещение полей в памяти.

p.s. Обновил код, т.к. в Pres была ошибка.
0
Миниатюры
GetThreadSelectorEntry в .NET  
m0nax
1162 / 863 / 56
Регистрация: 12.01.2010
Сообщений: 1,821
Завершенные тесты: 3
04.09.2011, 17:41 #7
juline, попробую объяснить на пальцах чтоль )

return ( Value & 0x6000 ) >> 13;
6?
есть указания где что находится
C#
1
2
3
      DWORD BaseMid  :8; //смещение 0 размер 8 бит
      DWORD Type  :5; //смещение 8 размер 5 бит
      DWORD Dpl  :2; //вот это нам нужно сейчас
итого смещение 13 бит (5 + 8)
размер 2 бита

значит нужно обнулить все биты кроме 2 бит по смещению 13 и сместить на 13 ( >> 13)
открываешь калькулятор винды, режим программиста, тыкаешь радиобаттон HEX, ниже "4 байта"

теперь смотри на двоичное представление числа, сейчас там 32 нуля
отсчитываешь глазами 13 нулей справа, затем тыкаешь на 2 следующих нуля и они становятся единицами
Смотришь на число вверху, вуаля - это та самая маска которую нужно применить чтоб обнулить все биты кроме нужных

в результате получаеся как раз return ( Value & 0x6000 ) >> 13;

Обратный процесс - достаточно нажать кнопку Not (побитовое отрицание) и получаем 0xFFFF9FFF
0
Миниатюры
GetThreadSelectorEntry в .NET  
04.09.2011, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:41
Привет! Вот еще темы с ответами:

Переписать метод с 4 .net в 3.5 .net или ниже - C#
и так ребят мне нужно этот код переписать чтоб он работал в .net 3.5 как макс желательно 2.0 private Stream _stream = null; ...

Преобразовать программу NET 2.0 framework в Net 4.0 - C#
По наследству достался проект, которыи требуется преобразовать из NET 2.0 framework в Net 4.0. Проблема в том, что внутри кода методом...

Какие отличия .NET и .NET 2003? - .NET
Доброго времени суток. В инете надыбали .NET 2003, в связи с чем и вопрос - кто нить работал с ней? Есть ли какие либо отличия от...

Как работать с интернет в VB.NET и С#.Net ??? - .NET
Как работать с интернет в VB.NET и С#.Нет ??? а то в вб подключил компонент Мсинет.окс, и работай, а тут такого не видно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru