windows-nt/Source/XPSP1/NT/printscan/fax/setup/ocm/help.cpp
2020-09-26 16:20:57 +08:00

159 lines
3.5 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
help.c
Abstract:
This file implements the code for the help file installation.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 17-Feb-1996
--*/
#include "faxocm.h"
#pragma hdrstop
#define HELP_INDEX_TAG ":Index "
#define HELP_INDEX_SEP '='
#define CRLF "\r\n"
#define FAX_HELP_STRING ":Index Fax Help=fax.hlp"
#define FAX_HELP_TAG "Fax Help"
#define HELP_INDEX_TAG_LEN 7
#define FAX_HELP_TAG_LEN 8
#define FAX_HELP_STRING_LEN 23
#define CRLF_LEN 2
BOOL
InstallHelpFiles(
VOID
)
{
BOOL rVal = FALSE;
TCHAR Buffer[MAX_PATH];
HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hMap = NULL;
LPSTR fPtr = NULL;
LPSTR p,s;
DWORD FileSize;
INT cmp;
ExpandEnvironmentStrings( L"%windir%\\system32\\windows.cnt", Buffer, sizeof(Buffer) );
hFile = CreateFile(
Buffer,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
goto exit;
}
FileSize = GetFileSize( hFile, NULL );
if (FileSize == 0xffffffff) {
goto exit;
}
hMap = CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
FileSize + 1024,
NULL
);
if (!hMap) {
goto exit;
}
fPtr = (LPSTR) MapViewOfFile(
hMap,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
if (!fPtr) {
goto exit;
}
p = fPtr;
while (p<fPtr+FileSize) {
if (_strnicmp( p, HELP_INDEX_TAG, HELP_INDEX_TAG_LEN ) == 0) {
p += HELP_INDEX_TAG_LEN;
s = strchr( p, HELP_INDEX_SEP );
if (s) {
cmp = (INT)strncmp( p, FAX_HELP_TAG, (ULONG)(s-p) );
if (cmp == 0) {
//
// fax help is already installed
//
goto exit;
} else if (cmp > 0) {
//
// this is where we insert it
//
p -= HELP_INDEX_TAG_LEN;
MoveMemory( p+FAX_HELP_STRING_LEN+CRLF_LEN, p, FileSize-(p-fPtr) );
CopyMemory( p, FAX_HELP_STRING, FAX_HELP_STRING_LEN );
p += FAX_HELP_STRING_LEN;
CopyMemory( p, CRLF, CRLF_LEN );
UnmapViewOfFile( fPtr );
CloseHandle( hMap );
fPtr = NULL;
hMap = NULL;
SetFilePointer( hFile, FileSize+FAX_HELP_STRING_LEN+CRLF_LEN, NULL, FILE_BEGIN );
SetEndOfFile( hFile );
break;
}
}
}
//
// skip to the next line
//
while( *p != '\n' ) p++;
p += 1;
}
ExpandEnvironmentStrings( L"%windir%\\system32\\windows.gid", Buffer, sizeof(Buffer) );
MyDeleteFile( Buffer );
ExpandEnvironmentStrings( L"%windir%\\system32\\windows.fts", Buffer, sizeof(Buffer) );
MyDeleteFile( Buffer );
ExpandEnvironmentStrings( L"%windir%\\system32\\windows.ftg", Buffer, sizeof(Buffer) );
MyDeleteFile( Buffer );
rVal = TRUE;
exit:
if (fPtr) {
UnmapViewOfFile( fPtr );
}
if (hMap) {
CloseHandle( hMap );
}
if (hFile) {
CloseHandle( hFile );
}
return rVal;
}