00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
#include "kdp.h"
00023 
00024 
#ifdef ALLOC_PRAGMA
00025 
#pragma alloc_text(PAGEKD, KdpMoveMemory)
00026 
#pragma alloc_text(PAGEKD, KdpQuickMoveMemory)
00027 
#endif
00028 
00029 
00030 ULONG
00031 KdpMoveMemory (
00032     IN PCHAR Destination,
00033     IN PCHAR Source,
00034     IN ULONG Length
00035     )
00036 
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     PVOID Address1;
00063     PVOID Address2;
00064     ULONG ActualLength;
00065     HARDWARE_PTE Opaque;
00066 
00067     
00068     
00069     
00070     
00071 
00072     
if (Length > 
KDP_MESSAGE_BUFFER_SIZE) {
00073         Length = 
KDP_MESSAGE_BUFFER_SIZE;
00074     }
00075 
00076     
00077     
00078     
00079 
00080     ActualLength = Length;
00081     Address1 = 
NULL;
00082 
00083     
while (((ULONG_PTR)Source & 3) && (Length > 0)) {
00084 
00085     
00086     
00087     
00088     
00089 
00090         Address1 = 
MmDbgWriteCheck((PVOID)Destination, &Opaque);
00091         Address2 = 
MmDbgReadCheck((PVOID)Source);
00092         
if ((Address1 == 
NULL) || (Address2 == 
NULL)) {
00093             
break;
00094         }
00095         *(PCHAR)Address1 = *(PCHAR)Address2;
00096         
MmDbgReleaseAddress(Address1, &Opaque);
00097         Address1 = 
NULL;
00098 
00099         Destination += 1;
00100         Source += 1;
00101         Length -= 1;
00102     }
00103 
00104     
if (Address1 != 
NULL) {
00105         
MmDbgReleaseAddress(Address1, &Opaque);
00106         Address1 = 
NULL;
00107     }
00108 
00109     
while (Length > 3) {
00110 
00111     
00112     
00113     
00114     
00115 
00116         Address1 = 
MmDbgWriteCheck((PVOID)Destination, &Opaque);
00117         Address2 = 
MmDbgReadCheck((PVOID)Source);
00118         
if ((Address1 == 
NULL) || (Address2 == 
NULL)) {
00119             
break;
00120         }
00121         *(ULONG UNALIGNED *)Address1 = *(PULONG)Address2;
00122         
MmDbgReleaseAddress(Address1, &Opaque);
00123         Address1 = 
NULL;
00124 
00125         Destination += 4;
00126         Source += 4;
00127         Length -= 4;
00128 
00129     }
00130 
00131     
if (Address1 != 
NULL) {
00132         
MmDbgReleaseAddress(Address1, &Opaque);
00133         Address1 = 
NULL;
00134     }
00135 
00136     
while (Length > 0) {
00137 
00138     
00139     
00140     
00141     
00142 
00143         Address1 = 
MmDbgWriteCheck((PVOID)Destination, &Opaque);
00144         Address2 = 
MmDbgReadCheck((PVOID)Source);
00145         
if ((Address1 == 
NULL) || (Address2 == 
NULL)) {
00146             
break;
00147         }
00148         *(PCHAR)Address1 = *(PCHAR)Address2;
00149         
MmDbgReleaseAddress(Address1, &Opaque);
00150         Address1 = 
NULL;
00151 
00152         Destination += 1;
00153         Source += 1;
00154         Length -= 1;
00155     }
00156 
00157     
if (Address1 != 
NULL) {
00158         
MmDbgReleaseAddress(Address1, &Opaque);
00159         Address1 = 
NULL;
00160     }
00161 
00162     
00163     
00164     
00165     
00166 
00167     KeSweepCurrentIcache();
00168     
return ActualLength - Length;
00169 }
00170 
00171 
VOID
00172 KdpQuickMoveMemory (
00173     IN PCHAR Destination,
00174     IN PCHAR Source,
00175     IN ULONG Length
00176     )
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 {
00205     
while (Length > 0) {
00206         *Destination = *Source;
00207         Destination++;
00208         Source++;
00209         Length--;
00210     }
00211 }