windows-nt/Source/XPSP1/NT/shell/ext/hnw/nconn32/dhcp.cpp
2020-09-26 16:20:57 +08:00

293 lines
6.3 KiB
C++

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
dhcp.c
Abstract:
Functions to get information from VDHCP.VXD
Contents:
(OpenDhcpVxdHandle)
(DhcpVxdRequest)
DhcpReleaseAdapterIpAddress
DhcpRenewAdapterIpAddress
(ReleaseOrRenewAddress)
IsMediaDisconnected
Author:
Richard L Firth (rfirth) 30-Nov-1994
Revision History:
30-Nov-1994 rfirth
Created
--*/
#include "stdafx.h"
#include "NetConn.h"
#include "w9xdhcp.h"
#include "vxd32.h"
#ifdef __cplusplus
extern "C" {
#endif
//
// Private constants.
//
#define DHCP_IS_MEDIA_DISCONNECTED 5
#define PRIVATE static
//
// private prototypes
//
PRIVATE
DWORD
OpenDhcpVxdHandle(
void
);
PRIVATE
WORD
DhcpVxdRequest(
IN DWORD Handle,
IN WORD Request,
IN WORD BufferLength,
OUT LPVOID Buffer
);
PRIVATE
WORD
ReleaseOrRenewAddress(
UINT Request,
UINT AddressLength,
LPBYTE Address
);
//
// data
//
//
// functions
//
BOOL
IsMediaDisconnected(
IN OUT DWORD iae_context
)
{
DWORD handle;
handle = OpenDhcpVxdHandle();
if( handle ) {
WORD result;
DWORD MediaStatus = iae_context;
result = DhcpVxdRequest( handle,
DHCP_IS_MEDIA_DISCONNECTED,
sizeof(MediaStatus),
&MediaStatus
);
OsCloseVxdHandle( handle );
if( result == 0 && MediaStatus == TRUE ) return TRUE;
}
return FALSE;
}
/*******************************************************************************
*
* OpenDhcpVxdHandle
*
* On Snowball, just retrieves the (real-mode) entry point address to the VxD
*
* ENTRY nothing
*
* EXIT DhcpVxdEntryPoint set
*
* RETURNS DhcpVxdEntryPoint
*
* ASSUMES 1. We are running in V86 mode
*
******************************************************************************/
PRIVATE DWORD
OpenDhcpVxdHandle()
{
return OsOpenVxdHandle("VDHCP", VDHCP_Device_ID);
}
/*******************************************************************************
*
* DhcpVxdRequest
*
* Makes a DHCP VxD request - passes a function code, parameter buffer and
* length to the (real-mode/V86) VxD entry-point
*
* ENTRY Handle - handle for Win32 call
* Request - DHCP VxD request
* BufferLength - length of Buffer
* Buffer - pointer to request-specific parameters
*
* EXIT depends on request
*
* RETURNS Success - 0
* Failure - ERROR_PATH_NOT_FOUND
* Returned if a specified adapter address could not be
* found
*
* ERROR_BUFFER_OVERFLOW
* Returned if the supplied buffer is too small to contain
* the requested information
*
* ASSUMES
*
******************************************************************************/
PRIVATE WORD
DhcpVxdRequest(DWORD Handle, WORD Request, WORD BufferLength, LPVOID Buffer)
{
return (WORD) OsSubmitVxdRequest( Handle,
(INT)Request,
(LPVOID)Buffer,
(INT)BufferLength );
}
/*******************************************************************************
*
* DhcpReleaseAdapterIpAddress
*
* Attempts to release the IP address for an adapter
*
* ENTRY AdapterInfo - describing adapter to release address for
*
* EXIT nothing
*
* RETURNS Success - TRUE
* Failure - FALSE
*
******************************************************************************/
DWORD
DhcpReleaseAdapterIpAddress(PADAPTER_INFO AdapterInfo)
{
WORD result;
result = ReleaseOrRenewAddress(DHCP_RELEASE_IPADDRESS,
AdapterInfo->AddressLength,
AdapterInfo->Address
);
return (DWORD)result;
}
/*******************************************************************************
*
* DhcpRenewAdapterIpAddress
*
* Attempts to renew the IP address for an adapter
*
* ENTRY AdapterInfo - describing adapter to renew address for
*
* EXIT nothing
*
* RETURNS Success - TRUE
* Failure - FALSE
*
* ASSUMES
*
******************************************************************************/
DWORD
DhcpRenewAdapterIpAddress(PADAPTER_INFO AdapterInfo)
{
WORD result;
result = ReleaseOrRenewAddress(DHCP_RENEW_IPADDRESS,
AdapterInfo->AddressLength,
AdapterInfo->Address
);
return (DWORD)result;
}
/*******************************************************************************
*
* ReleaseOrRenewAddress
*
* Given a physical adapter address and length, renews or releases the IP
* address lease for this adapter
*
* ENTRY Request - DHCP_RELEASE_IPADDRESS or DHCP_RENEW_IPADDRESS
* AddressLength - length of Address
* Address - pointer to byte array which is physical adapter
* address
*
* EXIT nothing
*
* RETURNS Success - ERROR_SUCCESS
* Failure - ERROR_NOT_ENOUGH_MEMORY
* ERROR_FILE_NOT_FOUND
* ERROR_PATH_NOT_FOUND
* ERROR_BUFFER_OVERFLOW
*
* ASSUMES
*
******************************************************************************/
PRIVATE WORD
ReleaseOrRenewAddress(UINT Request, UINT AddressLength, LPBYTE Address)
{
DWORD handle;
handle = OpenDhcpVxdHandle();
if (handle)
{
LPDHCP_HW_INFO info;
WORD result;
WORD length;
length = sizeof(DHCP_HW_INFO) + AddressLength;
info = (LPDHCP_HW_INFO)LocalAlloc(LPTR, length);
if (!info)
{
return ERROR_NOT_ENOUGH_MEMORY;
}
info->OffsetHardwareAddress = sizeof(*info);
info->HardwareLength = AddressLength;
memcpy(info + 1, Address, AddressLength);
result = DhcpVxdRequest(handle, (WORD)Request, length, (LPVOID)info);
OsCloseVxdHandle(handle);
LocalFree(info);
return result;
}
return ERROR_FILE_NOT_FOUND;
}
#ifdef __cplusplus
}
#endif