Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

226 lines
6.8 KiB

/****************************** Module Header ******************************\
* Module Name: hsfile.c
*
* Copyright (c) 1985-96, Microsoft Corporation
*
* 09/05/96 GerardoB Created
\***************************************************************************/
#include "hsplit.h"
/*********************************************************************
* hsUnmapFile
*
\***************************************************************************/
void hsUnmapFile (void)
{
LocalFree(gpmapStart);
CloseHandle(ghfileInput);
}
/*********************************************************************
* hsMapFile
*
\***************************************************************************/
BOOL hsMapFile (void)
{
DWORD dwFileSize, dwBytesRead;
ghfileInput = CreateFile(gpszInputFile, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
if (ghfileInput == INVALID_HANDLE_VALUE) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "CreateFile");
goto CleanupAndFail;
}
dwFileSize = GetFileSize(ghfileInput, NULL);
if (dwFileSize == 0xFFFFFFFF) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "GetFileSize");
goto CleanupAndFail;
}
gpmapStart = LocalAlloc(LPTR, dwFileSize + 1);
if (!gpmapStart) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "LocalAlloc");
goto CleanupAndFail;
}
if (!ReadFile(ghfileInput, gpmapStart, dwFileSize, &dwBytesRead, NULL)) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "ReadFile");
goto CleanupAndFail;
}
if (dwFileSize != dwBytesRead) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "ReadFile");
goto CleanupAndFail;
}
gpmapEnd = gpmapStart + dwFileSize;
gpmapStart[dwFileSize] = '\0';
#if 0
ghmap = CreateFileMapping(ghfileInput, NULL, PAGE_READONLY, 0, 0, NULL);
if (ghmap == NULL) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "CreateFileMapping");
goto CleanupAndFail;
}
gpmapStart = MapViewOfFile(ghmap, FILE_MAP_READ, 0, 0, 0);
if (gpmapStart == NULL) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "MapViewOfFile");
goto CleanupAndFail;
}
gpmapEnd = gpmapStart + dwFileSize;
#endif
return TRUE;
CleanupAndFail:
hsLogMsg(HSLM_ERROR | HSLM_NOLINE, "hsMapFile failed. File: '%s'", gpszInputFile);
return FALSE;
}
/*********************************************************************
* hsCloseWorkingFiles
*
\***************************************************************************/
BOOL hsCloseWorkingFiles (void)
{
CloseHandle(ghfilePublic);
CloseHandle(ghfileInternal);
hsUnmapFile();
return TRUE;
}
/*********************************************************************
* hsOpenWorkingFiles
*
\***************************************************************************/
BOOL hsOpenWorkingFiles (void)
{
char * pszFileFailed;
/*
* Map input file to memory
*/
if (!hsMapFile()) {
pszFileFailed = gpszInputFile;
goto CleanupAndFail;
}
/*
* Open/Create public header file
*/
ghfilePublic = CreateFile(gpszPublicFile, GENERIC_WRITE, 0, NULL,
(gdwOptions & HSO_APPENDOUTPUT ? OPEN_EXISTING : CREATE_ALWAYS),
FILE_ATTRIBUTE_NORMAL, NULL);
if (ghfilePublic == INVALID_HANDLE_VALUE) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "CreateFile");
pszFileFailed = gpszPublicFile;
goto CleanupAndFail;
}
if (gdwOptions & HSO_APPENDOUTPUT) {
if (0xFFFFFFFF == SetFilePointer (ghfilePublic, 0, 0, FILE_END)) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "SetFilePointer");
pszFileFailed = gpszPublicFile;
goto CleanupAndFail;
}
}
/*
* Open/Create internal header file
*/
ghfileInternal = CreateFile(gpszInternalFile, GENERIC_WRITE, 0, NULL,
(gdwOptions & HSO_APPENDOUTPUT ? OPEN_EXISTING : CREATE_ALWAYS),
FILE_ATTRIBUTE_NORMAL, NULL);
if (ghfileInternal == INVALID_HANDLE_VALUE) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "CreateFile");
pszFileFailed = gpszInternalFile;
goto CleanupAndFail;
}
if (gdwOptions & HSO_APPENDOUTPUT) {
if (0xFFFFFFFF == SetFilePointer (ghfileInternal, 0, 0, FILE_END)) {
hsLogMsg(HSLM_APIERROR | HSLM_NOLINE, "SetFilePointer");
pszFileFailed = gpszInternalFile;
goto CleanupAndFail;
}
}
return TRUE;
CleanupAndFail:
hsLogMsg(HSLM_ERROR | HSLM_NOLINE, "hsOpenWorkingFiles failed. File:'%s'", pszFileFailed);
return FALSE;
}
/***************************************************************************\
* hsWriteHeaderFiles
*
\***************************************************************************/
BOOL hsWriteHeaderFiles (char * pmap, DWORD dwSize, DWORD dwFlags)
{
DWORD dwWritten;
/*
* propagate the flags from previous blocks
*/
if (ghsbStack < gphsbStackTop) {
dwFlags |= (gphsbStackTop - 1)->dwMask;
}
/*
* write this to the public/private files only if the
* extractonly flag is not set !
*/
if (!(dwFlags & HST_EXTRACTONLY)) {
/*
* If defaulting or if requested, write it to the public header
*/
if (!(dwFlags & HST_BOTH)
|| (dwFlags & (HST_PUBLIC | HST_INCINTERNAL))) {
if (!WriteFile(ghfilePublic, pmap, dwSize, &dwWritten, NULL)) {
hsLogMsg(HSLM_APIERROR, "WriteFile");
hsLogMsg(HSLM_ERROR, "Error writing public header: %s. Handle:%#lx.", gpszPublicFile, ghfilePublic);
return FALSE;
}
}
/*
* Write it to internal header if requested
*/
if ((dwFlags & HST_INTERNAL) && !(dwFlags & HST_INCINTERNAL)) {
if (!WriteFile(ghfileInternal, pmap, dwSize, &dwWritten, NULL)) {
hsLogMsg(HSLM_APIERROR, "WriteFile");
hsLogMsg(HSLM_ERROR, "Error writing internal header: %s. Handle:%#lx.", gpszInternalFile, ghfileInternal);
return FALSE;
}
}
}
/*
* Write it to extract header if requested
*/
if (!(dwFlags & HST_INTERNAL) && (dwFlags & HST_EXTRACT)) {
PHSEXTRACT pe = gpExtractFile;
while (pe != NULL) {
if ((pe->dwMask & dwFlags) != HST_EXTRACT) {
if (!WriteFile(pe->hfile, pmap, dwSize, &dwWritten, NULL)) {
hsLogMsg(HSLM_APIERROR, "WriteFile");
hsLogMsg(HSLM_ERROR, "Error writing extract header: %s. Handle:%#lx.",
pe->pszFile, pe->hfile);
return FALSE;
}
}
pe = pe->pNext;
}
}
return TRUE;
}