269 lines
4.3 KiB
C
269 lines
4.3 KiB
C
|
//
|
||
|
// REGMISC.C
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1995
|
||
|
//
|
||
|
|
||
|
#include "pch.h"
|
||
|
|
||
|
//
|
||
|
// RgChecksum
|
||
|
//
|
||
|
|
||
|
DWORD
|
||
|
INTERNAL
|
||
|
RgChecksum(
|
||
|
LPVOID lpBuffer,
|
||
|
UINT ByteCount
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPDWORD lpdwBuffer;
|
||
|
DWORD Checksum;
|
||
|
|
||
|
lpdwBuffer = (LPDWORD) lpBuffer;
|
||
|
ByteCount >>= 2;
|
||
|
Checksum = 0;
|
||
|
|
||
|
while (ByteCount) {
|
||
|
Checksum += *lpdwBuffer++;
|
||
|
ByteCount--;
|
||
|
}
|
||
|
|
||
|
return Checksum;
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// RgHashString
|
||
|
//
|
||
|
// Simple hash computation of a counted string. All characters less than 0x80
|
||
|
// 0x80 and all DBCS characters are added up.
|
||
|
//
|
||
|
|
||
|
DWORD
|
||
|
INTERNAL
|
||
|
RgHashString(
|
||
|
LPCSTR lpString,
|
||
|
UINT Length
|
||
|
)
|
||
|
{
|
||
|
|
||
|
DWORD Hash;
|
||
|
UINT Byte;
|
||
|
|
||
|
Hash = 0;
|
||
|
|
||
|
while (Length) {
|
||
|
|
||
|
Byte = *((LPBYTE) lpString)++;
|
||
|
|
||
|
if (IsDBCSLeadByte((BYTE) Byte)) {
|
||
|
|
||
|
Hash += Byte;
|
||
|
Length--;
|
||
|
Hash += (*((LPBYTE) lpString)++);
|
||
|
|
||
|
}
|
||
|
|
||
|
else if (Byte < 0x80)
|
||
|
Hash += ToUpper(Byte);
|
||
|
|
||
|
Length--;
|
||
|
|
||
|
}
|
||
|
|
||
|
return Hash;
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// RgStrCmpNI
|
||
|
//
|
||
|
|
||
|
int
|
||
|
INTERNAL
|
||
|
RgStrCmpNI(
|
||
|
LPCSTR lpString1,
|
||
|
LPCSTR lpString2,
|
||
|
UINT Length
|
||
|
)
|
||
|
{
|
||
|
|
||
|
int Difference;
|
||
|
|
||
|
while (Length) {
|
||
|
|
||
|
if (IsDBCSLeadByte(*lpString1)) {
|
||
|
|
||
|
if ((Difference = *lpString1 - *lpString2) != 0)
|
||
|
return Difference;
|
||
|
|
||
|
lpString1++;
|
||
|
lpString2++;
|
||
|
Length--;
|
||
|
|
||
|
if (Length == 0)
|
||
|
break;
|
||
|
|
||
|
if ((Difference = *lpString1 - *lpString2) != 0)
|
||
|
return Difference;
|
||
|
|
||
|
}
|
||
|
|
||
|
else if ((Difference = (int) ToUpper(*lpString1) -
|
||
|
(int) ToUpper(*lpString2)) != 0)
|
||
|
return Difference;
|
||
|
|
||
|
lpString1++;
|
||
|
lpString2++;
|
||
|
Length--;
|
||
|
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// RgCopyFileBytes
|
||
|
//
|
||
|
// Copies the specified number of bytes from the source to the destination
|
||
|
// starting at the specified offsets in each file.
|
||
|
//
|
||
|
|
||
|
int
|
||
|
INTERNAL
|
||
|
RgCopyFileBytes(
|
||
|
HFILE hSourceFile,
|
||
|
LONG SourceOffset,
|
||
|
HFILE hDestinationFile,
|
||
|
LONG DestinationOffset,
|
||
|
DWORD cbSize
|
||
|
)
|
||
|
{
|
||
|
|
||
|
int ErrorCode;
|
||
|
LPVOID lpWorkBuffer;
|
||
|
UINT cbBytesThisPass;
|
||
|
|
||
|
ASSERT(hSourceFile != HFILE_ERROR);
|
||
|
ASSERT(hDestinationFile != HFILE_ERROR);
|
||
|
|
||
|
ErrorCode = ERROR_REGISTRY_IO_FAILED; // Assume this error code
|
||
|
|
||
|
lpWorkBuffer = RgLockWorkBuffer();
|
||
|
|
||
|
if (!RgSeekFile(hSourceFile, SourceOffset))
|
||
|
goto ErrorUnlockWorkBuffer;
|
||
|
|
||
|
if (!RgSeekFile(hDestinationFile, DestinationOffset))
|
||
|
goto ErrorUnlockWorkBuffer;
|
||
|
|
||
|
while (cbSize) {
|
||
|
|
||
|
cbBytesThisPass = (UINT) ((DWORD) min(cbSize, SIZEOF_WORK_BUFFER));
|
||
|
|
||
|
if (!RgReadFile(hSourceFile, lpWorkBuffer, cbBytesThisPass)) {
|
||
|
TRAP();
|
||
|
goto ErrorUnlockWorkBuffer;
|
||
|
}
|
||
|
|
||
|
RgYield();
|
||
|
|
||
|
if (!RgWriteFile(hDestinationFile, lpWorkBuffer, cbBytesThisPass)) {
|
||
|
TRAP();
|
||
|
goto ErrorUnlockWorkBuffer;
|
||
|
}
|
||
|
|
||
|
RgYield();
|
||
|
|
||
|
cbSize -= cbBytesThisPass;
|
||
|
|
||
|
}
|
||
|
|
||
|
ErrorCode = ERROR_SUCCESS;
|
||
|
|
||
|
ErrorUnlockWorkBuffer:
|
||
|
RgUnlockWorkBuffer(lpWorkBuffer);
|
||
|
return ErrorCode;
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// RgGenerateAltFileName
|
||
|
//
|
||
|
|
||
|
BOOL
|
||
|
INTERNAL
|
||
|
RgGenerateAltFileName(
|
||
|
LPCSTR lpFileName,
|
||
|
LPSTR lpAltFileName,
|
||
|
char ExtensionChar
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPSTR lpString;
|
||
|
|
||
|
StrCpy(lpAltFileName, lpFileName);
|
||
|
lpString = lpAltFileName + StrLen(lpAltFileName) - 3;
|
||
|
|
||
|
*lpString++ = '~';
|
||
|
*lpString++ = '~';
|
||
|
*lpString = ExtensionChar;
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
#ifdef VXD
|
||
|
|
||
|
#pragma VxD_RARE_CODE_SEG
|
||
|
|
||
|
//
|
||
|
// RgCopyFile
|
||
|
//
|
||
|
|
||
|
int
|
||
|
INTERNAL
|
||
|
RgCopyFile(
|
||
|
LPCSTR lpSourceFile,
|
||
|
LPCSTR lpDestinationFile
|
||
|
)
|
||
|
{
|
||
|
|
||
|
int ErrorCode;
|
||
|
HFILE hSourceFile;
|
||
|
HFILE hDestinationFile;
|
||
|
DWORD FileSize;
|
||
|
|
||
|
ErrorCode = ERROR_REGISTRY_IO_FAILED; // Assume this error code
|
||
|
|
||
|
if ((hSourceFile = RgOpenFile(lpSourceFile, OF_READ)) != HFILE_ERROR) {
|
||
|
|
||
|
if ((FileSize = RgGetFileSize(hSourceFile)) != (DWORD) -1) {
|
||
|
|
||
|
if ((hDestinationFile = RgCreateFile(lpDestinationFile)) !=
|
||
|
HFILE_ERROR) {
|
||
|
|
||
|
ErrorCode = RgCopyFileBytes(hSourceFile, 0, hDestinationFile, 0,
|
||
|
FileSize);
|
||
|
|
||
|
RgCloseFile(hDestinationFile);
|
||
|
|
||
|
if (ErrorCode != ERROR_SUCCESS)
|
||
|
RgDeleteFile(lpDestinationFile);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
RgCloseFile(hSourceFile);
|
||
|
|
||
|
}
|
||
|
|
||
|
return ErrorCode;
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif // VXD
|