ElfFile::ElfFile(ElfContent& data) : offsets(data), header(data.progHeaders.size() > 0 ? ElfHeaderX86_64::NewExecutable() : ElfHeaderX86_64::NewObjectFile()), file(1024) , dataSectionStart(file), sectionHeadersStart(file) { InitialiseHeader(data); InitialiseFile(data); // Process the program headers ProcessProgHeaders( data); sectionHeadersStart.Offset() = WriteDataSections(data); Bootstrap(data); header.SectionTableStart() = sectionHeadersStart.Offset(); WriteSectionHeaders(data); // Finally write the header file.Writer().Write(&header,header.Size()); // clean up any extra data file.Resize( (long)sectionHeadersStart + header.Sections() * header.SectionHeaderSize() ); }
/*++ Routine Name: CXPSArchive::GetFileStream Routine Description: This routine retrieves the read stream for an XPS part. Arguments: szFileName - The name of the XPS part the stream is required for ppFileStream - Pointer to an ISequentialStream pointer that recieves the stream Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CXPSArchive::GetFileStream( _In_z_ PCSTR szFileName, _Outptr_ ISequentialStream** ppFileStream ) { HRESULT hr = S_OK; // // Initialise the current XPS file // if (SUCCEEDED(hr = CHECK_POINTER(ppFileStream, E_POINTER)) && SUCCEEDED(hr = InitialiseFile(szFileName))) { // // Query the XPS file for the file stream // *ppFileStream = NULL; hr = m_XpsFile.QueryInterface(IID_ISequentialStream, reinterpret_cast<PVOID*>(ppFileStream)); } ERR_ON_HR(hr); return hr; }