293 lines
6.3 KiB
C++
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
|