//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: header.cxx // // Contents: Code to manage MSF header // // Classes: Defined in header.hxx // //-------------------------------------------------------------------------- #include "msfhead.cxx" #include "h/dfver.h" // Function set [uArg] to the byte order of the machine. // // it will return 0xFFFE on Little Endian (== the disk order) // and 0xFEFF on Big Endian const BYTE abDiskByteOrder[]= {0xFE, 0xFF}; inline void SetMachineByteOrder(USHORT *pUShort) { memcpy(pUShort, abDiskByteOrder, sizeof(abDiskByteOrder)); } CMSFHeader::CMSFHeader(USHORT uSectorShift) { msfAssert((CSECTFATREAL != CSECTFAT) || (sizeof(CMSFHeader) == HEADERSIZE)); _uSectorShift = uSectorShift; _uMiniSectorShift = MINISECTORSHIFT; _ulMiniSectorCutoff = MINISTREAMSIZE; _clid = IID_NULL; SetMachineByteOrder(&_uByteOrder); _uMinorVersion = rmm; _uDllVersion = (USHORT) (uSectorShift > SECTORSHIFT512 ? rmjlarge : rmj); for (SECT sect = 0; sect < CSECTFAT; sect ++) { _sectFat[sect] = FREESECT; } SetDifLength(0); SetDifStart(ENDOFCHAIN); SetFatLength(1); SetFatStart(SECTFAT); SetDirStart(SECTDIR); SetMiniFatLength(0); SetMiniFatStart(ENDOFCHAIN); _signature = 0; _usReserved = 0; _ulReserved1 = 0; _csectDir = (uSectorShift > SECTORSHIFT512) ? 1 : 0; // Write DocFile signature memcpy(abSig, SIGSTG, CBSIGSTG); } //+--------------------------------------------------------------------------- // // Function: CheckSignature, private // // Synopsis: Checks the given memory against known signatures // // Arguments: [pb] - Pointer to memory to check // // Returns: S_OK - Current signature // S_FALSE - Beta 2 signature, but still successful // Appropriate status code // //---------------------------------------------------------------------------- //Identifier for first bytes of Beta 2 Docfiles const BYTE SIGSTG_B2[] = {0x0e, 0x11, 0xfc, 0x0d, 0xd0, 0xcf, 0x11, 0xe0}; const BYTE CBSIGSTG_B2 = sizeof(SIGSTG_B2); SCODE CheckSignature(BYTE *pb) { SCODE sc; msfDebugOut((DEB_ITRACE, "In CheckSignature(%p)\n", pb)); // Check for ship Docfile signature first if (memcmp(pb, SIGSTG, CBSIGSTG) == 0) sc = S_OK; // Check for Beta 2 Docfile signature else if (memcmp(pb, SIGSTG_B2, CBSIGSTG_B2) == 0) sc = S_FALSE; else sc = STG_E_INVALIDHEADER; msfDebugOut((DEB_ITRACE, "Out CheckSignature => %lX\n", sc)); return sc; } //+------------------------------------------------------------------------- // // Method: CMSFHeader::Validate, public // // Synopsis: Validate a header. // // Returns: S_OK if header is valid. // //-------------------------------------------------------------------------- SCODE CMSFHeader::Validate(VOID) const { SCODE sc; USHORT uShift; sc = CheckSignature((BYTE *)abSig); if (sc == S_OK) { uShift = GetSectorShift(); // Check file format verson number if (GetDllVersion() > rmjlarge) return STG_E_OLDDLL; // check for invalid sector shifts if ((uShift != SECTORSHIFT512 && uShift != SECTORSHIFT4K) || GetMiniSectorShift() != MINISECTORSHIFT ) { return STG_E_DOCFILECORRUPT; } } return sc; }