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
#include "ki.h"
00026
00027
00028
00029
00030
00031
00032
#if defined(ALLOC_PRAGMA)
00033
00034
#pragma alloc_text(INIT, KeInitSystem)
00035
#pragma alloc_text(INIT, KiInitSystem)
00036
#pragma alloc_text(INIT, KiComputeReciprocal)
00037
00038
#endif
00039
00040 BOOLEAN
00041 KeInitSystem (
00042 VOID
00043 )
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 {
00066
00067 BOOLEAN
Initialized =
TRUE;
00068
00069
00070
00071
00072
00073
#if 0
00074
00075
if ((
Initialized =
KiChannelInitialization()) ==
FALSE) {
00076 KdPrint((
"Kernel: Channel initialization failed\n"));
00077 }
00078
00079
#endif
00080
00081
#if defined(i386)
00082
00083
00084
00085
00086
00087
Initialized =
KiInitMachineDependent();
00088
00089
#endif
00090
00091
00092
return Initialized;
00093 }
00094
00095
VOID
00096 KiInitSystem (
00097 VOID
00098 )
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 {
00117
00118 ULONG
Index;
00119
00120
00121
00122
00123
00124
for (
Index = 0;
Index < MAXIMUM_PRIORITY;
Index += 1) {
00125 InitializeListHead(&
KiDispatcherReadyListHead[
Index]);
00126 }
00127
00128
00129
00130
00131
00132 InitializeListHead(&
KeBugCheckCallbackListHead);
00133
KeInitializeSpinLock(&
KeBugCheckCallbackLock);
00134
00135
00136
00137
00138
00139
KeInitializeDpc(&
KiTimerExpireDpc,
00140 (
PKDEFERRED_ROUTINE)
KiTimerExpiration,
NIL);
00141
00142
00143
00144
00145
00146
KeInitializeSpinLock(&
KiProfileLock);
00147 InitializeListHead(&
KiProfileListHead);
00148
00149
00150
00151
00152
00153 InitializeListHead(&
KiProfileSourceListHead);
00154
00155
00156
00157
00158
00159
00160
for (
Index = 0;
Index <
TIMER_TABLE_SIZE;
Index += 1) {
00161 InitializeListHead(&
KiTimerTableListHead[
Index]);
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
KeInitializeEvent(&
KiSwapEvent,
00171 SynchronizationEvent,
00172
FALSE);
00173
00174 InitializeListHead(&
KiProcessInSwapListHead);
00175 InitializeListHead(&
KiProcessOutSwapListHead);
00176 InitializeListHead(&
KiStackInSwapListHead);
00177 InitializeListHead(&
KiWaitInListHead);
00178 InitializeListHead(&
KiWaitOutListHead);
00179
00180
00181
00182
00183
00184
KeServiceDescriptorTable[0].
Base = &
KiServiceTable[0];
00185
KeServiceDescriptorTable[0].
Count =
NULL;
00186
KeServiceDescriptorTable[0].
Limit =
KiServiceLimit;
00187
#if defined(_IA64_)
00188
00189
00190
00191
00192
00193
00194
KeServiceDescriptorTable[0].TableBaseGpOffset =
00195 (LONG)(*(
KiServiceTable-1) - (ULONG_PTR)
KiServiceTable);
00196
#endif
00197
KeServiceDescriptorTable[0].
Number = &
KiArgumentTable[0];
00198
for (
Index = 1;
Index <
NUMBER_SERVICE_TABLES;
Index += 1) {
00199
KeServiceDescriptorTable[
Index].
Limit = 0;
00200 }
00201
00202
00203
00204
00205
00206
00207 RtlCopyMemory(
KeServiceDescriptorTableShadow,
00208
KeServiceDescriptorTable,
00209
sizeof(
KeServiceDescriptorTable));
00210
00211
00212
00213
00214
00215
#if defined(_COLLECT_FLUSH_SINGLE_CALLDATA_)
00216
00217
ExInitializeCallData(&
KiFlushSingleCallData);
00218
00219
#endif
00220
00221
#if defined(_COLLECT_SET_EVENT_CALLDATA_)
00222
00223
ExInitializeCallData(&
KiSetEventCallData);
00224
00225
#endif
00226
00227
#if defined(_COLLECT_WAIT_SINGLE_CALLDATA_)
00228
00229
ExInitializeCallData(&
KiWaitSingleCallData);
00230
00231
#endif
00232
00233
return;
00234 }
00235
00236 LARGE_INTEGER
00237 KiComputeReciprocal (
00238 IN LONG Divisor,
00239 OUT PCCHAR Shift
00240 )
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 {
00264
00265 LARGE_INTEGER Fraction;
00266 LONG NumberBits;
00267 LONG Remainder;
00268
00269
00270
00271
00272
00273 NumberBits = 0;
00274 Remainder = 1;
00275 Fraction.LowPart = 0;
00276 Fraction.HighPart = 0;
00277
while (Fraction.HighPart >= 0) {
00278 NumberBits += 1;
00279 Fraction.HighPart = (Fraction.HighPart << 1) | (Fraction.LowPart >> 31);
00280 Fraction.LowPart <<= 1;
00281 Remainder <<= 1;
00282
if (Remainder >= Divisor) {
00283 Remainder -= Divisor;
00284 Fraction.LowPart |= 1;
00285 }
00286 }
00287
00288
if (Remainder != 0) {
00289
if ((Fraction.LowPart == 0xffffffff) && (Fraction.HighPart == 0xffffffff)) {
00290 Fraction.LowPart = 0;
00291 Fraction.HighPart = 0x80000000;
00292 NumberBits -= 1;
00293
00294 }
else {
00295
if (Fraction.LowPart == 0xffffffff) {
00296 Fraction.LowPart = 0;
00297 Fraction.HighPart += 1;
00298
00299 }
else {
00300 Fraction.LowPart += 1;
00301 }
00302 }
00303 }
00304
00305
00306
00307
00308
00309 *Shift = (CCHAR)(NumberBits - 64);
00310
return Fraction;
00311 }