/****************************** 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; }