windows-nt/Source/XPSP1/NT/net/dhcp/server/mmreg/regsave.c
2020-09-26 16:20:57 +08:00

1066 lines
31 KiB
C

//================================================================================
// Copyright (C) 1997 Microsoft Corporation
// Author: RameshV
// Description: This implements the save functionality.. whenever something needs
// to be saved onto the registry, this is the place...
// it is expected that this would be used only during API re-configuration or
// during routine "address-allocation" where the bitmask needs to be flushed to disk
//================================================================================
#include <mmregpch.h>
#include <regutil.h>
#define InitArray(X) do{DWORD Error = MemArrayInit((X)); Require(ERROR_SUCCESS == Error); }while(0)
#define ERRCHK do{if( ERROR_SUCCESS != Error ) goto Cleanup; }while(0)
#define FreeArray1(X) Error = LoopThruArray((X), DestroyString, NULL, NULL);Require(ERROR_SUCCESS == Error);
#define FreeArray2(X) Error = MemArrayCleanup((X)); Require(ERROR_SUCCESS == Error);
#define FreeArray(X) do{ DWORD Error; FreeArray1(X); FreeArray2(X); }while(0)
#define Report(Who) if(Error) DbgPrint("[DHCPServer] %s: %ld [0x%lx]\n", Who, Error, Error)
typedef DWORD (*ARRAY_FN)(PREG_HANDLE, LPWSTR ArrayString, LPVOID MemObject);
DWORD
LoopThruArray(
IN PARRAY Array,
IN ARRAY_FN ArrayFn,
IN PREG_HANDLE Hdl,
IN LPVOID MemObject
);
DWORD
DestroyString(
IN PREG_HANDLE RegHdl,
IN LPWSTR Str,
IN LPVOID Something
);
//BeginExport(function)
DWORD
DhcpRegSaveOptDef(
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName,
IN LPWSTR Name,
IN LPWSTR Comment,
IN DWORD OptType,
IN LPBYTE OptVal,
IN DWORD OptLen
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
LPWSTR OptDefStr;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
Error = ERROR_NOT_ENOUGH_MEMORY;
} else {
Error = DhcpRegServerGetOptDefHdl(&Hdl, OptDefStr, &Hdl2);
MemFree(OptDefStr);
}
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegOptDefSetAttributes(
&Hdl2,
&Name,
&Comment,
&OptType,
&OptId,
&ClassName,
&VendorName,
&OptVal,
OptLen
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteOptDef(
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
LPWSTR OptDefStr;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
Error = ERROR_NOT_ENOUGH_MEMORY;
} else {
Error = DhcpRegServerGetOptDefHdl(&Hdl, L"", &Hdl2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegRecurseDelete(&Hdl2, OptDefStr);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
MemFree(OptDefStr);
}
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveGlobalOption(
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName,
IN LPBYTE Value,
IN DWORD ValueSize
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
LPWSTR OptDefStr;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
DhcpRegCloseHdl(&Hdl);
return ERROR_NOT_ENOUGH_MEMORY;
}
Error = DhcpRegServerGetOptHdl(&Hdl, OptDefStr, &Hdl2);
MemFree(OptDefStr);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegOptSetAttributes(
&Hdl2,
&OptId,
&ClassName,
&VendorName,
NULL,
&Value,
ValueSize
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteGlobalOption(
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
LPWSTR OptDefStr;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
Error = ERROR_NOT_ENOUGH_MEMORY;
} else {
Error = DhcpRegServerGetOptHdl(&Hdl, L"", &Hdl2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegRecurseDelete(&Hdl2, OptDefStr);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
MemFree(OptDefStr);
}
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveSubnetOption(
IN PM_SUBNET Subnet,
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName,
IN LPBYTE Value,
IN DWORD ValueSize
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2, Hdl3;
LPWSTR OptDefStr;
WCHAR SubnetStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
DhcpRegCloseHdl(&Hdl);
return ERROR_NOT_ENOUGH_MEMORY;
}
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, SubnetStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegSubnetGetOptHdl(&Hdl2, OptDefStr, &Hdl3);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
MemFree(OptDefStr);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegOptSetAttributes(
&Hdl3,
&OptId,
&ClassName,
&VendorName,
NULL,
&Value,
ValueSize
);
Error2 = DhcpRegCloseHdl(&Hdl3);
Require(ERROR_SUCCESS == Error2);
}
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteSubnetOption(
IN PM_SUBNET Subnet,
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2, Hdl3;
LPWSTR OptDefStr;
WCHAR SubnetStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
DhcpRegCloseHdl(&Hdl);
return ERROR_NOT_ENOUGH_MEMORY;
}
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, SubnetStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegSubnetGetOptHdl(&Hdl2, L"", &Hdl3);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegRecurseDelete(&Hdl3, OptDefStr);
Error2 = DhcpRegCloseHdl(&Hdl3);
Require(ERROR_SUCCESS == Error2);
}
MemFree(OptDefStr);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveReservedOption(
IN DWORD Address,
IN DWORD ReservedAddress,
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName,
IN LPBYTE Value,
IN DWORD ValueSize
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2, Hdl3;
LPWSTR OptDefStr;
WCHAR SubnetStr[sizeof("000.000.000.000")];
WCHAR ReservedStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
DhcpRegCloseHdl(&Hdl);
return ERROR_NOT_ENOUGH_MEMORY;
}
Error = DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Address, SubnetStr), &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegSubnetGetReservationHdl(&Hdl2, ConvertAddressToLPWSTR(ReservedAddress, ReservedStr), &Hdl3);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegReservationGetOptHdl(&Hdl3, OptDefStr, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl3);
Require(ERROR_SUCCESS == Error2);
}
MemFree(OptDefStr);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegOptSetAttributes(
&Hdl2,
&OptId,
&ClassName,
&VendorName,
NULL,
&Value,
ValueSize
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteReservedOption(
IN DWORD Address,
IN DWORD ReservedAddress,
IN DWORD OptId,
IN LPWSTR ClassName,
IN LPWSTR VendorName
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2, Hdl3;
LPWSTR OptDefStr;
WCHAR SubnetStr[sizeof("000.000.000.000")];
WCHAR ReservedStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
OptDefStr = DhcpRegCombineClassAndOption(ClassName, VendorName, OptId);
if( NULL == OptDefStr ) {
DhcpRegCloseHdl(&Hdl);
return ERROR_NOT_ENOUGH_MEMORY;
}
Error = DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Address, SubnetStr), &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegSubnetGetReservationHdl(&Hdl2, ConvertAddressToLPWSTR(ReservedAddress, ReservedStr), &Hdl3);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegReservationGetOptHdl(&Hdl3, L"", &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl3);
Require(ERROR_SUCCESS == Error2);
}
if( ERROR_SUCCESS == Error ) {
Error = DhcpRegRecurseDelete(&Hdl2, OptDefStr);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
}
MemFree(OptDefStr);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveClassDef(
IN LPWSTR Name,
IN LPWSTR Comment,
IN DWORD Flags,
IN LPBYTE Data,
IN DWORD DataLength
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
if( NULL == Name ) return ERROR_INVALID_PARAMETER;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetClassDefHdl(&Hdl, Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
Error = DhcpRegClassDefSetAttributes(
&Hdl2,
&Name,
&Comment,
&Flags,
&Data,
DataLength
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteClassDef(
IN LPWSTR Name
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
if( NULL == Name ) return ERROR_INVALID_PARAMETER;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetClassDefHdl(&Hdl, L"", &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
Error = DhcpRegRecurseDelete(&Hdl2, Name);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveReservation(
IN DWORD Subnet,
IN DWORD Address,
IN DWORD Flags,
IN LPBYTE ClientUID,
IN DWORD ClientUIDLength
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2, Hdl3;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet, AddressStr), &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error) return Error;
Error = DhcpRegSubnetGetReservationHdl(&Hdl2, ConvertAddressToLPWSTR(Address, AddressStr), &Hdl3);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegReservationSetAttributes(
&Hdl3,
NULL,
NULL,
&Flags,
&Address,
&ClientUID,
ClientUIDLength
);
Error2 = DhcpRegCloseHdl(&Hdl3);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteReservation(
IN DWORD Subnet,
IN DWORD Address
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2, Hdl3;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet, AddressStr), &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error) return Error;
Error = DhcpRegSubnetGetReservationHdl(&Hdl2, L"", &Hdl3);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRecurseDelete(&Hdl3, ConvertAddressToLPWSTR(Address, AddressStr));
Error2 = DhcpRegCloseHdl(&Hdl3);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSScopeDeleteSubnet(
IN LPWSTR SScopeName,
IN DWORD SubnetAddress
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetSScopeHdl(&Hdl, SScopeName, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRecurseDelete(&Hdl2, ConvertAddressToLPWSTR(SubnetAddress, AddressStr));
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
DWORD
DhcpRegpDelSubnetFromSScope(
IN PREG_HANDLE Unused,
IN LPWSTR SScopeName,
IN LPVOID Address
)
{
DWORD Error;
Error = DhcpRegSScopeDeleteSubnet(SScopeName, PtrToUlong(Address));
return ERROR_SUCCESS; // ignore if this subnet is not found in this sscope
}
//BeginExport(function)
DWORD
DhcpRegDelSubnetFromAllSScopes(
IN DWORD Address
) //EndExport(function)
{
DWORD Error, Error2;
ARRAY Array;
REG_HANDLE Hdl, Hdl2;
Error = MemArrayInit(&Array);
Require(ERROR_SUCCESS == Error);
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetList(&Hdl, NULL, NULL, NULL, &Array, NULL, NULL);
if( ERROR_SUCCESS == Error ) {
Error = LoopThruArray(
&Array, DhcpRegpDelSubnetFromSScope, &Hdl,
ULongToPtr(Address));
}
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
FreeArray(&Array);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSScopeSaveSubnet(
IN LPWSTR SScopeName,
IN DWORD Address
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetSScopeHdl(&Hdl, SScopeName, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegGetNextHdl(&Hdl2, ConvertAddressToLPWSTR(Address, AddressStr), &Hdl);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteSScope(
IN LPWSTR SScopeName
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetSScopeHdl(&Hdl, L"", &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRecurseDelete(&Hdl2, SScopeName );
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveSubnet(
IN DWORD SubnetAddress,
IN DWORD SubnetMask,
IN DWORD SubnetState,
IN LPWSTR SubnetName,
IN LPWSTR SubnetComment
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(SubnetAddress, AddressStr), &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegSubnetSetAttributes(
&Hdl2,
&SubnetName,
&SubnetComment,
&SubnetState,
&SubnetAddress,
&SubnetMask
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteSubnet(
IN PM_SUBNET Subnet
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
LPWSTR KeyName;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = Subnet->fSubnet ? DhcpRegServerGetSubnetHdl(&Hdl, L"" , &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, L"" , &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
KeyName = Subnet->fSubnet ? ConvertAddressToLPWSTR(Subnet->Address, AddressStr) : Subnet->Name;
Error = DhcpRegRecurseDelete(&Hdl2, KeyName);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegAddRange(
IN PM_SUBNET Subnet,
IN DWORD RangeStartAddress,
IN DWORD RangeEndAddress,
IN ULONG BootpAllocated,
IN ULONG MaxBootpAllowed,
IN DWORD Type
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
LPWSTR KeyName;
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegRangeSetAttributes(
&Hdl,
NULL,
NULL,
&Type,
&BootpAllocated,
&MaxBootpAllowed,
&RangeStartAddress,
&RangeEndAddress,
NULL,
0,
NULL,
0
);
Error2 = DhcpRegCloseHdl(&Hdl);
Require( ERROR_SUCCESS == Error2 );
return Error;
}
//BeginExport(function)
DWORD
DhcpRegAddRangeEx(
IN PM_SUBNET Subnet,
IN DWORD RangeStartAddress,
IN DWORD RangeEndAddress,
IN DWORD Type,
IN ULONG BootpAllocated,
IN ULONG MaxBootpAllowed,
IN LPBYTE InUseClusters,
IN DWORD InUseClustersSize,
IN LPBYTE UsedClusters,
IN DWORD UsedClustersSize
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, AddressStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegSubnetGetRangeHdl(&Hdl2, ConvertAddressToLPWSTR(RangeStartAddress, AddressStr), &Hdl);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRangeSetAttributes(
&Hdl,
NULL,
NULL,
&Type,
&BootpAllocated,
&MaxBootpAllowed,
&RangeStartAddress,
&RangeEndAddress,
&InUseClusters,
InUseClustersSize,
&UsedClusters,
UsedClustersSize
);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteRange(
IN PM_SUBNET Subnet,
IN DWORD RangeStartAddress
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, AddressStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegSubnetGetRangeHdl(&Hdl2, L"", &Hdl);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRecurseDelete(&Hdl, ConvertAddressToLPWSTR(RangeStartAddress, AddressStr));
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegDeleteRangeEx(
IN PM_SUBNET Subnet,
IN DWORD RangeStartAddress,
OUT LPBYTE *InUseClusters,
OUT DWORD *InUseClustersSize,
OUT LPBYTE *UsedClusters,
OUT DWORD *UsedClustersSize
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, AddressStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegSubnetGetRangeHdl(&Hdl2, ConvertAddressToLPWSTR(RangeStartAddress, AddressStr), &Hdl);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRangeGetAttributes(
&Hdl,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
InUseClusters,
InUseClustersSize,
UsedClusters,
UsedClustersSize
);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
return DhcpRegDeleteRange(Subnet, RangeStartAddress);
}
//BeginExport(function)
DWORD
DhcpRegSaveExcl(
IN PM_SUBNET Subnet,
IN LPBYTE ExclBytes,
IN DWORD nBytes
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, AddressStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegSubnetSetExclusions(
&Hdl2,
&ExclBytes,
nBytes
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveBitMask(
IN PM_SUBNET Subnet,
IN DWORD RangeStartAddress,
IN LPBYTE InUse,
IN DWORD InUseSize,
IN LPBYTE Used,
IN DWORD UsedSize
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = Subnet->fSubnet
? DhcpRegServerGetSubnetHdl(&Hdl, ConvertAddressToLPWSTR(Subnet->Address, AddressStr), &Hdl2)
: DhcpRegServerGetMScopeHdl(&Hdl, Subnet->Name, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegSubnetGetRangeHdl(&Hdl2, ConvertAddressToLPWSTR(RangeStartAddress, AddressStr), &Hdl);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegRangeSetAttributes(
&Hdl,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&InUse,
InUseSize,
&Used,
UsedSize
);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//BeginExport(function)
DWORD
DhcpRegSaveMScope(
IN DWORD MScopeId,
IN DWORD SubnetState,
IN DWORD AddressPolicy,
IN DWORD TTL,
IN LPWSTR pMScopeName,
IN LPWSTR pMScopeComment,
IN LPWSTR LangTag,
IN PDATE_TIME ExpiryTime
) //EndExport(function)
{
DWORD Error, Error2;
REG_HANDLE Hdl, Hdl2;
WCHAR AddressStr[sizeof("000.000.000.000")];
Require( pMScopeName );
Error = DhcpRegGetThisServer(&Hdl);
if( NO_ERROR != Error ) return Error;
Error = DhcpRegServerGetMScopeHdl(&Hdl, pMScopeName, &Hdl2);
Error2 = DhcpRegCloseHdl(&Hdl);
Require(ERROR_SUCCESS == Error2);
if( ERROR_SUCCESS != Error ) return Error;
Error = DhcpRegMScopeSetAttributes(
&Hdl2,
&pMScopeComment,
&SubnetState,
&MScopeId,
&AddressPolicy,
&TTL,
&LangTag,
&ExpiryTime
);
Error2 = DhcpRegCloseHdl(&Hdl2);
Require(ERROR_SUCCESS == Error2);
return Error;
}
//================================================================================
// end of file
//================================================================================