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 "ntrtlp.h"
00027
00028
00029
00030
00031
00032
USHORT
00033
ChkSum(
00034 ULONG PartialSum,
00035 PUSHORT Source,
00036 ULONG Length
00037 );
00038
00039
#if defined(ALLOC_PRAGMA) && defined(NTOS_KERNEL_RUNTIME)
00040
#if !defined(_IA64_)
00041
#pragma alloc_text(PAGE,ChkSum)
00042
#endif // !defined(_IA64_)
00043
#pragma alloc_text(PAGE,LdrVerifyMappedImageMatchesChecksum)
00044
#endif
00045
00046
#if !defined(_IA64_)
00047
USHORT
00048 ChkSum(
00049 ULONG PartialSum,
00050 PUSHORT Source,
00051 ULONG Length
00052 )
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 {
00076
00077
RTL_PAGED_CODE();
00078
00079
00080
00081
00082
00083
00084
while (Length--) {
00085 PartialSum += *Source++;
00086 PartialSum = (PartialSum >> 16) + (PartialSum & 0xffff);
00087 }
00088
00089
00090
00091
00092
00093
00094
return (
USHORT)(((PartialSum >> 16) + PartialSum) & 0xffff);
00095 }
00096
#endif // !defined(_IA64_)
00097
00098 BOOLEAN
00099 LdrVerifyMappedImageMatchesChecksum (
00100 IN PVOID BaseAddress,
00101 IN ULONG FileLength
00102 )
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 {
00125
00126
PUSHORT AdjustSum;
00127 PIMAGE_NT_HEADERS NtHeaders;
00128
USHORT PartialSum;
00129 ULONG HeaderSum;
00130 ULONG CheckSum;
00131
00132
RTL_PAGED_CODE();
00133
00134
00135
00136
00137
00138 HeaderSum = 0;
00139 PartialSum =
ChkSum(0, (
PUSHORT)BaseAddress, (FileLength + 1) >> 1);
00140
00141
00142
00143
00144
00145
00146
00147 NtHeaders =
RtlImageNtHeader(BaseAddress);
00148
if (NtHeaders !=
NULL) {
00149 HeaderSum = NtHeaders->OptionalHeader.CheckSum;
00150
00151
#ifndef NTOS_KERNEL_RUNTIME
00152
00153
00154
00155
00156
00157
00158
00159
00160
if ( HeaderSum == 0 ) {
00161
return TRUE;
00162 }
00163
#endif // NTOS_KERNEL_RUNTIME
00164
00165 AdjustSum = (
PUSHORT)(&NtHeaders->OptionalHeader.CheckSum);
00166 PartialSum -= (PartialSum < AdjustSum[0]);
00167 PartialSum -= AdjustSum[0];
00168 PartialSum -= (PartialSum < AdjustSum[1]);
00169 PartialSum -= AdjustSum[1];
00170 }
else {
00171 PartialSum = 0;
00172 HeaderSum = FileLength;
00173 }
00174
00175
00176
00177
00178
00179
00180 CheckSum = (ULONG)PartialSum + FileLength;
00181
return (CheckSum == HeaderSum);
00182 }