|
|
/*++
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
|