|
void BootloaderMain (void)<br />{<br /> ROMHDR *pRomHdr = NULL; // pTOC for NK image. MUST COPY IT OR CLEANBOOT may erase it<br /> DWORD dwAction, dwpToc; <br /> DWORD dwImageStart = 0, dwImageLength = 0, dwLaunchAddr = 0;<br /> BOOL bDownloaded = FALSE;<br /><br /> // relocate globals to RAM<br /> if (!KernelRelocate (pTOC)) {<br /> // spin forever<br /> HALT (BLERR_KERNELRELOCATE);<br /> }<br />**********************************<br />static BOOL KernelRelocate (ROMHDR *const pTOC)<br />{<br /> ULONG loop;<br /> COPYentry *cptr;<br /> if (pTOC == (ROMHDR *const) -1) {<br /> return FALSE; // spin forever!<br /> }<br /> // This is where the data sections become valid... don't read globals until after this<br /> for (loop = 0; loop < pTOC->ulCopyEntries; loop++) {<br /> cptr = (COPYentry *)(pTOC->ulCopyOffset + loop*sizeof(COPYentry));<br /> if (cptr->ulCopyLen)<br /> memcpy((LPVOID)cptr->ulDest,(LPVOID)cptr->ulSource,cptr->ulCopyLen);<br /> if (cptr->ulCopyLen != cptr->ulDestLen)<br /> memset((LPVOID)(cptr->ulDest+cptr->ulCopyLen),0,cptr->ulDestLen-cptr->ulCopyLen);<br /> }<br /> return TRUE;<br />}<br />**********************************<br />第一个问题:ROMHDR结构体内容分析:<br />typedef struct ROMHDR {<br /> ULONG dllfirst; // first DLL address<br /> ULONG dlllast; // last DLL address<br /> ULONG physfirst; // first physical address<br /> ULONG physlast; // highest physical address<br /> ULONG nummods; // number of TOCentry's<br /> ULONG ulRAMStart; // start of RAM<br /> ULONG ulRAMFree; // start of RAM free space<br /> ULONG ulRAMEnd; // end of RAM<br /> ULONG ulCopyEntries; // number of copy section entries<br /> ULONG ulCopyOffset; // offset to copy section<br /> ULONG ulProfileLen; // length of PROFentries RAM <br /> ULONG ulProfileOffset; // offset to PROFentries<br /> ULONG numfiles; // number of FILES<br /> ULONG ulKernelFlags; // optional kernel flags from ROMFLAGS .bib config option<br /> ULONG ulFSRamPercent; // Percentage of RAM used for filesystem <br /> // from FSRAMPERCENT .bib config option<br /> // byte 0 = #4K chunks/Mbyte of RAM for filesystem 0-2Mbytes 0-255<br /> // byte 1 = #4K chunks/Mbyte of RAM for filesystem 2-4Mbytes 0-255<br /> // byte 2 = #4K chunks/Mbyte of RAM for filesystem 4-6Mbytes 0-255<br /> // byte 3 = #4K chunks/Mbyte of RAM for filesystem > 6Mbytes 0-255<br /><br /> ULONG ulDrivglobStart; // device driver global starting address<br /> ULONG ulDrivglobLen; // device driver global length<br /> USHORT usCPUType; // CPU (machine) Type<br /> USHORT usMiscFlags; // Miscellaneous flags<br /> PVOID pExtensions; // pointer to ROM Header extensions<br /> ULONG ulTrackingStart; // tracking memory starting address<br /> ULONG ulTrackingLen; // tracking memory ending address<br />} ROMHDR; |
|