windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/buildhive/data.cpp
2020-09-26 16:20:57 +08:00

111 lines
2.2 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
data.cpp
Abstract:
Contains registry "Data" abstraction
implementation
Author:
Mike Cirello
Vijay Jayaseelan (vijayj)
Revision History:
03 March 2001 :
Rewamp the whole source to make it more maintainable
(particularly readable)
--*/
#include "Data.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//
// this class basically converts these variable types to a BYTE pointer
// so the info can be stored in the registry
//
// Arguments:
// b - data in BYTE stream. OPTIONAL
// d - data as a DWORD. OPTIONAL
// t - data in TCHAR stream. OPTIONAL
// flag - which data type is valid?
// bSize - if data is in BYTE stream this must have the length of the stream.
//
Data::Data(
IN PBYTE b,
IN DWORD d,
IN PCTSTR t,
IN DWORD flag,
IN int bSize)
{
DWORD fourthbyte = 4278190080;
DWORD thirdbyte = 16711680;
DWORD secondbyte = 65280;
DWORD firstbyte = 255;
PCTSTR ptr;
pByte = b;
dword = d;
pTchar = t;
nFlags = flag;
size = -1;
switch (nFlags) {
case (1):
size = bSize;
break;
case (2):
if ( pByte = new BYTE[4] ){
size = 4;
pByte[3] = (BYTE)((dword & fourthbyte) >> 24);
pByte[2] = (BYTE)((dword & thirdbyte) >> 16);
pByte[1] = (BYTE)((dword & secondbyte) >> 8);
pByte[0] = (BYTE)(dword & firstbyte);
}
break;
case (4):
size = wcslen(t)+1;
ptr = t+size;
while(*ptr!='\0') {
size += wcslen(ptr)+1;
ptr = t+size;
}
size *= 2;
size += 2;
case (3):
if (size == -1) {
size = (wcslen(t)*2)+2;
}
if ( pByte = new BYTE[size] ) {
for (int x=0;x<((size/2)-1);x++) {
pByte[x*2] = (BYTE)(pTchar[x] & firstbyte);
pByte[1+(x*2)] = (BYTE)((pTchar[x] & secondbyte) >> 8);
}
pByte[size-1] = pByte[size-2] = '\0';
}
break;
default:
break;
}
}