00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#include "ki.h"
00027
00028
#ifdef ALLOC_PRAGMA
00029
#pragma alloc_text(PAGE,KeI386SetGdtSelector)
00030
#endif
00031
00032
VOID
00033 Ke386GetGdtEntryThread(
00034 IN
PKTHREAD Thread,
00035 IN ULONG Offset,
00036 IN PKGDTENTRY Descriptor
00037 )
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 {
00064 PKGDTENTRY Gdt;
00065
PKPROCESS Process;
00066
00067
00068
00069
00070
00071
if (
Offset >= KGDT_NUMBER *
sizeof(KGDTENTRY)) {
00072
return ;
00073 }
00074
00075
if (
Offset == KGDT_LDT) {
00076
00077
00078
00079
00080
00081 Process = Thread->ApcState.Process;
00082 RtlMoveMemory( Descriptor,
00083 &(Process->LdtDescriptor),
00084
sizeof(KGDTENTRY)
00085 );
00086
00087 }
else {
00088
00089
00090
00091
00092
00093
00094
00095
00096 Gdt =
KiPcr()->GDT;
00097
00098 RtlMoveMemory(Descriptor, (PCHAR)Gdt +
Offset,
sizeof(KGDTENTRY));
00099
00100
00101
00102
00103
00104
if (
Offset == KGDT_R3_TEB) {
00105 Descriptor->BaseLow = (
USHORT)((ULONG)(Thread->Teb) & 0xFFFF);
00106 Descriptor->HighWord.Bytes.BaseMid =
00107 (UCHAR) ( ( (ULONG)(Thread->Teb) & 0xFF0000
L) >> 16);
00108 Descriptor->HighWord.Bytes.BaseHi =
00109 (
CHAR) ( ( (ULONG)(Thread->Teb) & 0xFF000000
L) >> 24);
00110 }
00111 }
00112
00113
return ;
00114 }
00115
00116
NTSTATUS
00117 KeI386SetGdtSelector (
00118 ULONG Selector,
00119 PKGDTENTRY GdtValue
00120 )
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 {
00139 KAFFINITY TargetSet;
00140 PKPRCB Prcb;
00141 PKPCR Pcr;
00142 PKGDTENTRY GdtEntry;
00143 ULONG GdtIndex, BitNumber;
00144
00145
PAGED_CODE ();
00146
00147
00148
00149
00150
00151 GdtIndex = Selector >> 3;
00152
if ((Selector & 0x7) != 0 || GdtIndex < KGDT_NUMBER) {
00153
return STATUS_UNSUCCESSFUL;
00154 }
00155
00156
00157
00158
00159
00160 TargetSet =
KeActiveProcessors;
00161
while (TargetSet != 0) {
00162 BitNumber =
KeFindFirstSetRightMember(TargetSet);
00163
ClearMember(BitNumber, TargetSet);
00164
00165 Prcb =
KiProcessorBlock[BitNumber];
00166 Pcr = CONTAINING_RECORD (Prcb, KPCR, PrcbData);
00167 GdtEntry = Pcr->GDT + GdtIndex;
00168
00169
00170 *GdtEntry = *GdtValue;
00171 }
00172
00173
return STATUS_SUCCESS;
00174 }