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 "exp.h"
00026
00027
#if defined(ALLOC_PRAGMA)
00028
#pragma alloc_text(PAGE, ProbeForWrite)
00029
#pragma alloc_text(PAGE, ProbeForRead)
00030
#endif
00031
00032
00033
VOID
00034 ProbeForWrite (
00035 IN PVOID Address,
00036 IN ULONG Length,
00037 IN ULONG Alignment
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 {
00065
00066 ULONG_PTR EndAddress;
00067 ULONG_PTR StartAddress;
00068
00069
00070
00071
00072
00073
00074
if (Length != 0) {
00075
00076
00077
00078
00079
00080
00081
ASSERT((Alignment == 1) || (Alignment == 2) ||
00082 (Alignment == 4) || (Alignment == 8) ||
00083 (Alignment == 16));
00084
00085 StartAddress = (ULONG_PTR)Address;
00086
if ((StartAddress & (Alignment - 1)) == 0) {
00087
00088
00089
00090
00091
00092
00093 EndAddress = StartAddress + Length - 1;
00094
if ((StartAddress <= EndAddress) &&
00095 (EndAddress < MM_USER_PROBE_ADDRESS)) {
00096
00097
00098
00099
00100
00101
00102
00103
00104 EndAddress = (EndAddress & ~(
PAGE_SIZE - 1)) +
PAGE_SIZE;
00105
00106
#if defined(_ALPHA_)
00107
00108
00109
00110
00111
00112
00113
00114 StartAddress &= ~((ULONG_PTR)
sizeof(LONG) - 1);
00115
00116
do {
00117 *(
volatile LONG *)StartAddress = *(
volatile LONG *)StartAddress;
00118 StartAddress = (StartAddress & ~(
PAGE_SIZE - 1)) +
PAGE_SIZE;
00119 }
while (StartAddress != EndAddress);
00120
00121
#else
00122
00123
do {
00124 *(
volatile CHAR *)StartAddress = *(
volatile CHAR *)StartAddress;
00125
00126 StartAddress = (StartAddress & ~(
PAGE_SIZE - 1)) +
PAGE_SIZE;
00127 }
while (StartAddress != EndAddress);
00128
#endif
00129
00130
return;
00131
00132 }
else {
00133
ExRaiseAccessViolation();
00134 }
00135
00136 }
else {
00137
ExRaiseDatatypeMisalignment();
00138 }
00139 }
00140
00141
return;
00142 }
00143
00144
#undef ProbeForRead
00145
NTKERNELAPI
00146
VOID
00147 NTAPI
00148 ProbeForRead(
00149 IN CONST VOID *Address,
00150 IN ULONG Length,
00151 IN ULONG Alignment
00152 )
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 {
00178
PAGED_CODE();
00179
00180
ASSERT(((Alignment) == 1) || ((Alignment) == 2) ||
00181 ((Alignment) == 4) || ((Alignment) == 8) ||
00182 ((Alignment) == 16));
00183
00184
if ((Length) != 0) {
00185
if (((ULONG_PTR)(Address) & ((Alignment) - 1)) != 0) {
00186
ExRaiseDatatypeMisalignment();
00187
00188 }
else if ((((ULONG_PTR)(Address) + (Length)) < (ULONG_PTR)(Address)) ||
00189 (((ULONG_PTR)(Address) + (Length)) > (ULONG_PTR)MM_USER_PROBE_ADDRESS)) {
00190
ExRaiseAccessViolation();
00191 }
00192 }
00193 }
00194