www.pudn.com > snmp.rar > snmpapi.c
/*++
Copyright (c) 1992-1997 Microsoft Corporation
Module Name:
snmpapi.c
Abstract:
Contains entry point for SNMPAPI.DLL.
Environment:
User Mode - Win32
Revision History:
--*/
///////////////////////////////////////////////////////////////////////////////
// //
// Include files //
// //
///////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#include
#include
#include "ntfuncs.h"
///////////////////////////////////////////////////////////////////////////////
// //
// Global Variables //
// //
///////////////////////////////////////////////////////////////////////////////
HMODULE g_hNtDll = NULL;
DWORD g_dwPlatformId = 0;
AsnObjectIdentifier * g_pEnterpriseOid = NULL;
PFNRTLGETNTPRODUCTTYPE g_pfnRtlGetNtProductType = NULL;
PFNNTQUERYSYSTEMINFORMATION g_pfnNtQuerySystemInformation = NULL;
PFNRTLEXTENDEDLARGEINTEGERDIVIDE g_pfnRtlExtendedLargeIntegerDivide = NULL;
///////////////////////////////////////////////////////////////////////////////
// //
// Private Variables //
// //
///////////////////////////////////////////////////////////////////////////////
static UINT idsWindowsNTWorkstation[] = {1,3,6,1,4,1,311,1,1,3,1,1};
static UINT idsWindowsNTServer[] = {1,3,6,1,4,1,311,1,1,3,1,2};
static UINT idsWindowsNTDC[] = {1,3,6,1,4,1,311,1,1,3,1,3};
static UINT idsWindows[] = {1,3,6,1,4,1,311,1,1,3,2};
static AsnObjectIdentifier oidWindowsNTWorkstation = {
sizeof(idsWindowsNTWorkstation)/sizeof(UINT),
idsWindowsNTWorkstation
};
static AsnObjectIdentifier oidWindowsNTServer = {
sizeof(idsWindowsNTServer)/sizeof(UINT),
idsWindowsNTServer
};
static AsnObjectIdentifier oidWindowsNTDC = {
sizeof(idsWindowsNTDC)/sizeof(UINT),
idsWindowsNTDC
};
static AsnObjectIdentifier oidWindows = {
sizeof(idsWindows)/sizeof(UINT),
idsWindows
};
///////////////////////////////////////////////////////////////////////////////
// //
// Private Procedures //
// //
///////////////////////////////////////////////////////////////////////////////
BOOL
LoadNtDll(
)
/*++
Routine Description:
Loads additional library used for NT-specific calls.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = FALSE;
// attempt to load ntdll.dll
g_hNtDll = LoadLibrary(TEXT("ntdll.dll"));
// validate handle
if (g_hNtDll != NULL) {
// load api to help determine enterprise oid
g_pfnRtlGetNtProductType = (PFNRTLGETNTPRODUCTTYPE)
GetProcAddress(
g_hNtDll,
"RtlGetNtProductType"
);
// load api to help determine system uptime
g_pfnNtQuerySystemInformation = (PFNNTQUERYSYSTEMINFORMATION)
GetProcAddress(
g_hNtDll,
"NtQuerySystemInformation"
);
// load api to help determine system uptime
g_pfnRtlExtendedLargeIntegerDivide = (PFNRTLEXTENDEDLARGEINTEGERDIVIDE)
GetProcAddress(
g_hNtDll,
"RtlExtendedLargeIntegerDivide"
);
// validate each function pointer
fOk = ((g_pfnRtlGetNtProductType != NULL) &&
(g_pfnNtQuerySystemInformation != NULL) &&
(g_pfnRtlExtendedLargeIntegerDivide != NULL));
}
return fOk;
}
BOOL
UnloadNtDll(
)
/*++
Routine Description:
Unloads additional library used for NT-specific calls.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = TRUE;
// validate handle
if (g_hNtDll != NULL) {
// unload library
fOk = FreeLibrary(g_hNtDll);
// re-initialize
g_hNtDll = NULL;
}
return fOk;
}
BOOL
InitializeEnterpriseOID(
)
/*++
Routine Description:
Determines the default enterprise object identifier.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
NT_PRODUCT_TYPE NtProductType;
// default to generic oid
g_pEnterpriseOid = &oidWindows;
// check to see if the platform is winnt
if (g_dwPlatformId == VER_PLATFORM_WIN32_NT) {
// assume this is just a workstation
g_pEnterpriseOid = &oidWindowsNTWorkstation;
// validate global data
if ((g_hNtDll != NULL) &&
(g_pfnRtlGetNtProductType != NULL)) {
// let the system determine product type
(*g_pfnRtlGetNtProductType)(&NtProductType);
// point to the correct enterprise oid
if (NtProductType == NtProductServer) {
// this is a stand-alone server
g_pEnterpriseOid = &oidWindowsNTServer;
} else if (NtProductType == NtProductLanManNt) {
// this is a PDC or a BDC
g_pEnterpriseOid = &oidWindowsNTDC;
}
}
}
SNMPDBG((
SNMP_LOG_TRACE,
"SNMP: INIT: enterprise is %s.\n",
SnmpUtilOidToA(g_pEnterpriseOid)
));
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// //
// Public Procedures //
// //
///////////////////////////////////////////////////////////////////////////////
BOOLEAN
InitializeDLL(
PVOID DllHandle,
ULONG Reason,
LPVOID lpReserved
)
/*++
Routine Description:
Dll entry point.
Arguments:
Same as DllMain.
Return Values:
Returns true if successful.
--*/
{
// check if new process attaching
if (Reason == DLL_PROCESS_ATTACH) {
OSVERSIONINFO osInfo;
// initialize os info structure
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// gather os info
GetVersionEx(&osInfo);
// save platform id for later use
g_dwPlatformId = osInfo.dwPlatformId;
// check to see if platform is windows nt
if (g_dwPlatformId == VER_PLATFORM_WIN32_NT) {
// more to do
LoadNtDll();
}
// initialize enterprise
InitializeEnterpriseOID();
// turn off thread attach messages
DisableThreadLibraryCalls(DllHandle);
// check if new process detaching
} else if (Reason == DLL_PROCESS_DETACH) {
// check to see if platform is windows nt
if (g_dwPlatformId == VER_PLATFORM_WIN32_NT) {
// more to do
UnloadNtDll();
}
}
return TRUE;
}