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
00029
00030
00031
00032
VOID
00033
KiLoadLdtr(
00034 VOID
00035 );
00036
00037
VOID
00038
KiFlushDescriptors(
00039 VOID
00040 );
00041
00042
00043
00044
00045
00046
VOID
00047
Ki386LoadTargetLdtr (
00048 IN PKIPI_CONTEXT SignalDone,
00049 IN PVOID Parameter1,
00050 IN PVOID Parameter2,
00051 IN PVOID Parameter3
00052 );
00053
00054
VOID
00055
Ki386FlushTargetDescriptors (
00056 IN PKIPI_CONTEXT SignalDone,
00057 IN PVOID Parameter1,
00058 IN PVOID Parameter2,
00059 IN PVOID Parameter3
00060 );
00061
00062
VOID
00063 Ke386SetLdtProcess (
00064 IN
PKPROCESS Process,
00065 IN PLDT_ENTRY Ldt,
00066 IN ULONG Limit
00067 )
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 {
00109
00110 KGDTENTRY LdtDescriptor;
00111 BOOLEAN LocalProcessor;
00112 KIRQL OldIrql;
00113 PKPRCB Prcb;
00114 KAFFINITY TargetProcessors;
00115
00116
00117
00118
00119
00120
if ((Ldt ==
NULL) || (Limit == 0)) {
00121
00122
00123
00124
00125
00126 LdtDescriptor.LimitLow = 0;
00127 LdtDescriptor.BaseLow = 0;
00128 LdtDescriptor.HighWord.Bytes.BaseMid = 0;
00129 LdtDescriptor.HighWord.Bytes.Flags1 = 0;
00130 LdtDescriptor.HighWord.Bytes.Flags2 = 0;
00131 LdtDescriptor.HighWord.Bytes.BaseHi = 0;
00132
00133 }
else {
00134
00135
00136
00137
00138
00139
00140
00141 LdtDescriptor.HighWord.Bytes.Flags1 = 0;
00142 LdtDescriptor.HighWord.Bytes.Flags2 = 0;
00143
00144
00145
00146
00147
00148 LdtDescriptor.LimitLow = (
USHORT) ((ULONG) Limit - 1);
00149 LdtDescriptor.BaseLow = (
USHORT) ((ULONG) Ldt & 0xffff);
00150 LdtDescriptor.HighWord.Bytes.BaseMid = (UCHAR) (((ULONG)Ldt & 0xff0000) >> 16);
00151 LdtDescriptor.HighWord.Bytes.BaseHi = (UCHAR) (((ULONG)Ldt & 0xff000000) >> 24);
00152
00153
00154
00155
00156
00157 LdtDescriptor.HighWord.Bits.Type = TYPE_LDT;
00158 LdtDescriptor.HighWord.Bits.Dpl = DPL_SYSTEM;
00159
00160
00161
00162
00163
00164 LdtDescriptor.HighWord.Bits.Pres = 1;
00165
00166 }
00167
00168
00169
00170
00171
00172
KiLockContextSwap(&OldIrql);
00173
00174
00175
00176
00177
00178 Process->LdtDescriptor = LdtDescriptor;
00179
00180
00181
00182
00183
00184
#ifdef NT_UP
00185
00186
KiLoadLdtr();
00187
00188
#else
00189
00190 Prcb =
KeGetCurrentPrcb();
00191 TargetProcessors = Process->ActiveProcessors & ~Prcb->SetMember;
00192
if (TargetProcessors != 0) {
00193
KiIpiSendPacket(TargetProcessors,
00194
Ki386LoadTargetLdtr,
00195
NULL,
00196
NULL,
00197
NULL);
00198 }
00199
00200
KiLoadLdtr();
00201
if (TargetProcessors != 0) {
00202
00203
00204
00205
00206
00207
KiIpiStallOnPacketTargets(TargetProcessors);
00208 }
00209
00210
#endif
00211
00212
00213
00214
00215
00216
KiUnlockContextSwap(OldIrql);
00217
return;
00218 }
00219
00220
VOID
00221 Ki386LoadTargetLdtr (
00222 IN PKIPI_CONTEXT SignalDone,
00223 IN PVOID Parameter1,
00224 IN PVOID Parameter2,
00225 IN PVOID Parameter3
00226 )
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 {
00244
00245
00246
00247
00248
00249
KiLoadLdtr();
00250
KiIpiSignalPacketDone(SignalDone);
00251
return;
00252 }
00253
00254
VOID
00255 Ke386SetDescriptorProcess (
00256 IN
PKPROCESS Process,
00257 IN ULONG Offset,
00258 IN LDT_ENTRY LdtEntry
00259 )
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 {
00294
00295 PLDT_ENTRY Ldt;
00296 KIRQL OldIrql;
00297 PKPRCB Prcb;
00298 KAFFINITY TargetProcessors;
00299
00300
00301
00302
00303
00304 Ldt =
00305 (PLDT_ENTRY)
00306 ((Process->LdtDescriptor.HighWord.Bytes.BaseHi << 24) |
00307 ((Process->LdtDescriptor.HighWord.Bytes.BaseMid << 16) & 0xff0000) |
00308 (Process->LdtDescriptor.BaseLow & 0xffff));
00309
Offset =
Offset / 8;
00310
MmLockPagedPool(&Ldt[
Offset],
sizeof(LDT_ENTRY));
00311
KiLockContextSwap(&OldIrql);
00312
00313
#ifdef NT_UP
00314
00315
00316
00317
00318
00319 Ldt[
Offset] = LdtEntry;
00320
00321
#else
00322
00323 Prcb =
KeGetCurrentPrcb();
00324 TargetProcessors = Process->ActiveProcessors & ~Prcb->SetMember;
00325
if (TargetProcessors != 0) {
00326 KiIpiSendSynchronousPacket(
00327 Prcb,
00328 TargetProcessors,
00329
Ki386FlushTargetDescriptors,
00330 (PVOID)&Prcb->ReverseStall,
00331
NULL,
00332
NULL);
00333
00334
KiIpiStallOnPacketTargets(TargetProcessors);
00335 }
00336
00337
00338
00339
00340
00341
00342
00343 Ldt[
Offset] = LdtEntry;
00344
if (TargetProcessors != 0) {
00345 Prcb->ReverseStall += 1;
00346 }
00347
00348
#endif
00349
00350
00351
00352
00353
00354
KiUnlockContextSwap(OldIrql);
00355
MmUnlockPagedPool(&Ldt[
Offset],
sizeof(LDT_ENTRY));
00356
return;
00357 }
00358
00359
VOID
00360 Ki386FlushTargetDescriptors (
00361 IN PKIPI_CONTEXT SignalDone,
00362 IN PVOID Proceed,
00363 IN PVOID Parameter2,
00364 IN PVOID Parameter3
00365 )
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 {
00386
00387
00388
00389
00390
00391
KiFlushDescriptors();
00392 KiIpiSignalPacketDoneAndStall (SignalDone, Proceed);
00393
return;
00394 }