+static BOOL
+PageNeedsWriteAccess(PVOID PageStart,
+ PVOID DriverBase,
+ PIMAGE_FILE_HEADER PEFileHeader,
+ PIMAGE_SECTION_HEADER PESectionHeaders)
+{
+ BOOL NeedsWriteAccess;
+ unsigned Idx;
+ ULONG Characteristics;
+ ULONG Length;
+ PVOID BaseAddress;
+
+ NeedsWriteAccess = FALSE;
+ /* Set the protections for the various parts of the driver */
+ for (Idx = 0; Idx < PEFileHeader->NumberOfSections && ! NeedsWriteAccess; Idx++)
+ {
+ Characteristics = PESectionHeaders[Idx].Characteristics;
+ if (!(Characteristics & IMAGE_SECTION_CHAR_CODE) ||
+ (Characteristics & IMAGE_SECTION_CHAR_WRITABLE ||
+ Characteristics & IMAGE_SECTION_CHAR_DATA ||
+ Characteristics & IMAGE_SECTION_CHAR_BSS))
+ {
+ Length =
+ max(PESectionHeaders[Idx].Misc.VirtualSize,
+ PESectionHeaders[Idx].SizeOfRawData);
+ BaseAddress = PESectionHeaders[Idx].VirtualAddress + DriverBase;
+ NeedsWriteAccess = BaseAddress < PageStart + PAGE_SIZE &&
+ PageStart < (PVOID)((PCHAR) BaseAddress + Length);
+ }
+ }
+
+ return(NeedsWriteAccess);
+}
+