1728 lines
53 KiB
C
1728 lines
53 KiB
C
/*
|
||
* HrFSEntry.c v0.10
|
||
* Generated in conjunction with Management Factory scripts:
|
||
* script version: SNMPv1, 0.16, Apr 25, 1996
|
||
* project: D:\TEMP\EXAMPLE\HOSTMIB
|
||
****************************************************************************
|
||
* *
|
||
* (C) Copyright 1995 DIGITAL EQUIPMENT CORPORATION *
|
||
* *
|
||
* This software is an unpublished work protected under the *
|
||
* the copyright laws of the United States of America, all *
|
||
* rights reserved. *
|
||
* *
|
||
* In the event this software is licensed for use by the United *
|
||
* States Government, all use, duplication or disclosure by the *
|
||
* United States Government is subject to restrictions as set *
|
||
* forth in either subparagraph (c)(1)(ii) of the Rights in *
|
||
* Technical Data And Computer Software Clause at DFARS *
|
||
* 252.227-7013, or the Commercial Computer Software Restricted *
|
||
* Rights Clause at FAR 52.221-19, whichever is applicable. *
|
||
* *
|
||
****************************************************************************
|
||
*
|
||
* Facility:
|
||
*
|
||
* Windows NT SNMP Extension Agent
|
||
*
|
||
* Abstract:
|
||
*
|
||
* This module contains the code for dealing with the get, set, and
|
||
* instance name routines for the HrFSEntry. Actual instrumentation code is
|
||
* supplied by the developer.
|
||
*
|
||
* Functions:
|
||
*
|
||
* A get and set routine for each attribute in the class.
|
||
*
|
||
* The routines for instances within the class.
|
||
*
|
||
* Author:
|
||
*
|
||
* D. D. Burns @ Webenable Inc
|
||
*
|
||
* Revision History:
|
||
*
|
||
* V1.00 - 04/18/97 D. D. Burns Genned: Thu Nov 07 16:44:44 1996
|
||
* V1.01 - 06/17/97 D. D. Burns Fix bug in Gen_HrFSTable_Cache() that
|
||
* precluded finding "hrFSStorageIndex"
|
||
* for drives w/volume labels.
|
||
*
|
||
*/
|
||
|
||
|
||
#include <windows.h>
|
||
#include <malloc.h>
|
||
|
||
#include <snmp.h>
|
||
|
||
#include "mib.h"
|
||
#include "smint.h"
|
||
#include "hostmsmi.h"
|
||
#include "user.h" /* Developer supplied include file */
|
||
#include "HMCACHE.H" /* Cache-related definitions */
|
||
#include "string.h" /* For string manipulation in "Gen_Hrstorage_Cache"*/
|
||
#include "stdio.h" /* For sprintf */
|
||
#include <winioctl.h> /* For PARTITION_INFORMATION */
|
||
|
||
|
||
/*
|
||
|==============================================================================
|
||
| Function prototypes for this module.
|
||
|
|
||
*/
|
||
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
|
||
static void
|
||
debug_print_hrFSTable(
|
||
CACHEROW *row /* Row in hrFSTable table */
|
||
);
|
||
|
||
|
||
/*
|
||
|==============================================================================
|
||
| Create the list-head for the HrFStable cache.
|
||
|
|
||
| - Global so that code in "ProcessPartitions()" in "HRDISKST.C" can search
|
||
| this cache.
|
||
|
|
||
| - This macro is defined in "HMCACHE.H".
|
||
*/
|
||
CACHEHEAD_INSTANCE(hrFSTable_cache, debug_print_hrFSTable);
|
||
|
||
|
||
|
||
/*
|
||
* GetHrFSIndex
|
||
* A unique value for each file system local to this host. The value for
|
||
* each file system must remain constant at least from one r
|
||
*
|
||
* Gets the value for HrFSIndex.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSIndex
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only INTEGER (1..2147483647)
|
||
|
|
||
| "A unique value for each file system local to this host. The value for each
|
||
| file system must remain constant at least from one re-initialization of the
|
||
| agent to the next re-initialization."
|
||
|
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| An entry is generated for each drive (network or not) returned by
|
||
| "GetLogicalDrives".
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.1.<instance>
|
||
| | | | |
|
||
| | | | *hrFSIndex
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSIndex(
|
||
OUT Integer *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
/*
|
||
| Return the "hrFSIndex" value from this entry
|
||
*/
|
||
*outvalue = row->attrib_list[HRFS_INDEX].u.unumber_value;
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSIndex() */
|
||
|
||
|
||
/*
|
||
* GetHrFSMountPoint
|
||
* The path name of the root of this file system.
|
||
*
|
||
* Gets the value for HrFSMountPoint.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSMountPoint
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only InternationalDisplayString (SIZE(0..128))
|
||
|
|
||
| "The path name of the root of this file system."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| The value of this attribute is the proper value returned by
|
||
| "GetLogicalDriveStrings" for the selected entry.
|
||
|
|
||
| RESOLVED >>>>>>>>
|
||
| <POA-15> Just return an empty string for the Mount Point variables.
|
||
| RESOLVED >>>>>>>>
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.2.<instance>
|
||
| | | | |
|
||
| | | | *hrFSMountPoint
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSMountPoint(
|
||
OUT InternationalDisplayString *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
/*
|
||
| The cache has the device string in it, but we return the empty string
|
||
| per the spec.
|
||
*/
|
||
#if 1
|
||
/* Return the empty string */
|
||
outvalue->string = "";
|
||
outvalue->length = 0;
|
||
#else
|
||
/* Return the cached string */
|
||
outvalue->string = row->attrib_list[HRFS_MOUNTPT].u.string_value;
|
||
outvalue->length = strlen(outvalue->string);
|
||
|
||
/* "Truncate" here to meet RFC as needed*/
|
||
if ((outvalue->length = strlen(outvalue->string)) > 128) {
|
||
outvalue->length = 128;
|
||
}
|
||
#endif
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSMountPoint() */
|
||
|
||
|
||
/*
|
||
* GetHrFSRemoteMountPoint
|
||
* A description of the name and/or address of the server that this file
|
||
* system is mounted from. This may also include parameters
|
||
*
|
||
* Gets the value for HrFSRemoteMountPoint.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSRemoteMountPoint
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only InternationalDisplayString (SIZE(0..128))
|
||
|
|
||
| "A description of the name and/or address of the server that this file system
|
||
| is mounted from. This may also include parameters such as the mount point on
|
||
| the remote file system. If this is not a remote file system, this string
|
||
| should have a length of zero."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| <POA-15> The starting point for deriving this attribute's value is the logical
|
||
| drive name, which would already be known to represent a network drive. I can
|
||
| find no Win32 API function that maps a network logical drive to it's server.
|
||
|
|
||
| RESOLVED >>>>>>>>
|
||
| <POA-15> Just return an empty string for the Mount Point variables.
|
||
| RESOLVED >>>>>>>>
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.3.<instance>
|
||
| | | | |
|
||
| | | | *hrFSRemoteMountPoint
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSRemoteMountPoint(
|
||
OUT InternationalDisplayString *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
|
||
/* Return the empty string */
|
||
outvalue->string = "";
|
||
outvalue->length = 0;
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSRemoteMountPoint() */
|
||
|
||
|
||
/*
|
||
* GetHrFSType
|
||
* The value of this object identifies the type of this file system.
|
||
*
|
||
* Gets the value for HrFSType.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSType
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only OBJECT IDENTIFIER
|
||
|
|
||
| "The value of this object identifies the type of this file system."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| -- Registration for some popular File System types,
|
||
| -- for use with hrFSType.
|
||
|
|
||
| hrFSTypes OBJECT IDENTIFIER ::= { hrDevice 9 }
|
||
|
|
||
| hrFSOther OBJECT IDENTIFIER ::= { hrFSTypes 1 }
|
||
| hrFSUnknown OBJECT IDENTIFIER ::= { hrFSTypes 2 }
|
||
| hrFSBerkeleyFFS OBJECT IDENTIFIER ::= { hrFSTypes 3 }
|
||
| hrFSSys5FS OBJECT IDENTIFIER ::= { hrFSTypes 4 }
|
||
| -- DOS
|
||
| hrFSFat OBJECT IDENTIFIER ::= { hrFSTypes 5 }
|
||
| -- OS/2 High Performance File System
|
||
| hrFSHPFS OBJECT IDENTIFIER ::= { hrFSTypes 6 }
|
||
| -- Macintosh Hierarchical File System
|
||
| hrFSHFS OBJECT IDENTIFIER ::= { hrFSTypes 7 }
|
||
|
|
||
|
|
||
| -- Macintosh File System
|
||
| hrFSMFS OBJECT IDENTIFIER ::= { hrFSTypes 8 }
|
||
| -- Windows NT
|
||
| hrFSNTFS OBJECT IDENTIFIER ::= { hrFSTypes 9 }
|
||
| hrFSVNode OBJECT IDENTIFIER ::= { hrFSTypes 10 }
|
||
| hrFSJournaled OBJECT IDENTIFIER ::= { hrFSTypes 11 }
|
||
| -- CD File systems
|
||
| hrFSiso9660 OBJECT IDENTIFIER ::= { hrFSTypes 12 }
|
||
| hrFSRockRidge OBJECT IDENTIFIER ::= { hrFSTypes 13 }
|
||
|
|
||
| hrFSNFS OBJECT IDENTIFIER ::= { hrFSTypes 14 }
|
||
| hrFSNetware OBJECT IDENTIFIER ::= { hrFSTypes 15 }
|
||
| -- Andrew File System
|
||
| hrFSAFS OBJECT IDENTIFIER ::= { hrFSTypes 16 }
|
||
| -- OSF DCE Distributed File System
|
||
| hrFSDFS OBJECT IDENTIFIER ::= { hrFSTypes 17 }
|
||
| hrFSAppleshare OBJECT IDENTIFIER ::= { hrFSTypes 18 }
|
||
| hrFSRFS OBJECT IDENTIFIER ::= { hrFSTypes 19 }
|
||
| -- Data General
|
||
| hrFSDGCFS OBJECT IDENTIFIER ::= { hrFSTypes 20 }
|
||
| -- SVR4 Boot File System
|
||
| hrFSBFS OBJECT IDENTIFIER ::= { hrFSTypes 21 }
|
||
|
|
||
| Win32 API function "GetVolumeInformation" can provide us with the
|
||
| information needed to select the correct OID for this attribute's value.
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.9.n
|
||
| | | |
|
||
| | | *-Type indicator
|
||
| | *-hrFSTypes
|
||
| *-hrDevice
|
||
|
|
||
| 1.3.6.1.2.1.25.3.8.1.4.<instance>
|
||
| | | | |
|
||
| | | | *hrFSType
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSType(
|
||
OUT ObjectIdentifier *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
/*
|
||
| By convention with the cache-building function "Gen_HrFSTable_Cache()",
|
||
| the cached value is the right-most arc we must return as the value.
|
||
|
|
||
| Hence whatever cache entry we retrieve, we tack the number retrieved
|
||
| from the cache for this attribute onto { hrFSTypes ... }.
|
||
*/
|
||
if ( (outvalue->ids = SNMP_malloc(10 * sizeof( UINT ))) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
outvalue->idLength = 10;
|
||
|
||
|
||
/*
|
||
| Load in the full hrFSType OID:
|
||
|
|
||
| 1.3.6.1.2.1.25.3.9.n
|
||
| | | |
|
||
| | | *-Type indicator
|
||
| | *-hrFSTypes
|
||
| *-hrDevice
|
||
*/
|
||
outvalue->ids[0] = 1;
|
||
outvalue->ids[1] = 3;
|
||
outvalue->ids[2] = 6;
|
||
outvalue->ids[3] = 1;
|
||
outvalue->ids[4] = 2;
|
||
outvalue->ids[5] = 1;
|
||
outvalue->ids[6] = 25;
|
||
outvalue->ids[7] = 3;
|
||
outvalue->ids[8] = 9;
|
||
|
||
/* Cached FS Type indicator */
|
||
outvalue->ids[9] = row->attrib_list[HRFS_TYPE].u.unumber_value;
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSType() */
|
||
|
||
|
||
/*
|
||
* GetHrFSAccess
|
||
* An indication if this file system is logically configured by the
|
||
* operating system to be readable and writable or only readable.
|
||
*
|
||
* Gets the value for HrFSAccess.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSAccess
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only INTEGER {readWrite(1),readOnly(2)}
|
||
|
|
||
| "An indication if this file system is logically configured by the operating
|
||
| system to be readable and writable or only readable. This does not represent
|
||
| any local access-control policy, except one that is applied to the file system
|
||
| as a whole."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| Win32 API function "GetVolumeInformation" can provide us with the information
|
||
| needed to select the correct OID for this attribute's value.
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.5.<instance>
|
||
| | | | |
|
||
| | | | *hrFSAccess
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSAccess(
|
||
OUT INTAccess *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
/*
|
||
| Return the "hrFSAccess" value from this entry
|
||
*/
|
||
*outvalue = row->attrib_list[HRFS_ACCESS].u.unumber_value;
|
||
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSAccess() */
|
||
|
||
|
||
/*
|
||
* GetHrFSBootable
|
||
* A falg indicating whether this file system is bootable.
|
||
*
|
||
* Gets the value for HrFSBootable.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSBootable
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only Boolean
|
||
|
|
||
| "A flag indicating whether this file system is bootable."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| Win32 API function "CreatFile" and DeviceIoControlcan provide us with the
|
||
| information needed to select the correct OID for this attribute's value.
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.6.<instance>
|
||
| | | | |
|
||
| | | | *hrFSBootable
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSBootable(
|
||
OUT Boolean *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
/*
|
||
| Return the "hrFSBootable" value from this entry
|
||
*/
|
||
*outvalue = row->attrib_list[HRFS_BOOTABLE].u.unumber_value;
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSBootable() */
|
||
|
||
|
||
/*
|
||
* GetHrFSStorageIndex
|
||
* The index of the hrStorageEntry that represents information about this
|
||
* file system. If there is no such information available,
|
||
*
|
||
* Gets the value for HrFSStorageIndex.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSStorageIndex
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-only INTEGER (0..2147483647)
|
||
|
|
||
| "The index of the hrStorageEntry that represents information about this file
|
||
| system. If there is no such information available, then this value shall be
|
||
| zero. The relevant storage entry will be useful in tracking the percent usage
|
||
| of this file system and diagnosing errors that may occur when it runs out of
|
||
| space."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.7.<instance>
|
||
| | | | |
|
||
| | | | *hrFSStorageIndex
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSStorageIndex(
|
||
OUT Integer *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
ULONG index; /* As fetched from instance structure */
|
||
CACHEROW *row; /* Row entry fetched from cache */
|
||
|
||
|
||
/*
|
||
| Grab the instance information
|
||
*/
|
||
index = GET_INSTANCE(0);
|
||
|
||
/*
|
||
| Use it to find the right entry in the cache
|
||
*/
|
||
if ((row = FindTableRow(index, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
|
||
/*
|
||
| Return the "hrFSStorageIndex" value from this entry
|
||
*/
|
||
*outvalue = row->attrib_list[HRFS_STORINDX].u.unumber_value;
|
||
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSStorageIndex() */
|
||
|
||
|
||
/*
|
||
* GetHrFSLastFullBackupDate
|
||
* The last date at which this complete file system was copied to another
|
||
* storage device for backup. This information is useful fo
|
||
*
|
||
* Gets the value for HrFSLastFullBackupDate.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSLastFullBackupDate
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-write DateAndTime
|
||
|
|
||
| "The last date at which this complete file system was copied to another
|
||
| storage device for backup. This information is useful for ensuring that
|
||
| backups are being performed regularly. If this information is not known, then
|
||
| this variable shall have the value corresponding to January 1, year 0000,
|
||
| 00:00:00.0, which is encoded as (hex)'00 00 01 01 00 00 00 00'."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| This metric is apparently not recorded and is not made available through
|
||
| any documented Win32 API function. Consequently, we return the appropriate
|
||
| "not known" value.
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.8.<instance>
|
||
| | | | |
|
||
| | | | *hrFSLastFullBackupDate
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSLastFullBackupDate(
|
||
OUT DateAndTime *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
|
||
outvalue->length = 8;
|
||
outvalue->string = "\0\0\1\1\0\0\0\0";
|
||
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSLastFullBackupDate() */
|
||
|
||
|
||
/*
|
||
* SetHrFSLastFullBackupDate
|
||
* The last date at which this complete file system was copied to another
|
||
* storage device for backup. This information is useful fo
|
||
*
|
||
* Sets the HrFSLastFullBackupDate value.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* invalue address of value to set the variable
|
||
* outvalue address to return the set variable value
|
||
* access Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_BADVALUE Set value not in range
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtset.ntc v0.10
|
||
*/
|
||
|
||
UINT
|
||
SetHrFSLastFullBackupDate(
|
||
IN DateAndTime *invalue ,
|
||
OUT DateAndTime *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
|
||
} /* end of SetHrFSLastFullBackupDate() */
|
||
|
||
|
||
/*
|
||
* GetHrFSLastPartialBackupDate
|
||
* The last date at which a portion of thes file system was copied to
|
||
* another storage device for backup. This information is usefu
|
||
*
|
||
* Gets the value for HrFSLastPartialBackupDate.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* outvalue address to return variable value
|
||
* accesss Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtget.c v0.10
|
||
*
|
||
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| hrFSLastPartialBackupDate
|
||
|
|
||
| ACCESS SYNTAX
|
||
| read-write DateAndTime
|
||
|
|
||
| "The last date at which a portion of this file system was copied to another
|
||
| storage device for backup. This information is useful for ensuring that
|
||
| backups are being performed regularly. If this information is not known,
|
||
| then this variable shall have the value corresponding to
|
||
| January 1, year 0000, 00:00:00.0, which is encoded as
|
||
| (hex)'00 00 01 01 00 00 00 00'."
|
||
|
|
||
| DISCUSSION:
|
||
|
|
||
| This metric is apparently not recorded and is not made available through
|
||
| any documented Win32 API function. Consequently, we return the appropriate
|
||
| "not known" value.
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1.9.<instance>
|
||
| | | | |
|
||
| | | | *hrFSLastPartialBackupDate
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
*/
|
||
|
||
UINT
|
||
GetHrFSLastPartialBackupDate(
|
||
OUT DateAndTime *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
|
||
outvalue->length = 8;
|
||
outvalue->string = "\0\0\1\1\0\0\0\0";
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of GetHrFSLastPartialBackupDate() */
|
||
|
||
|
||
/*
|
||
* SetHrFSLastPartialBackupDate
|
||
* The last date at which a portion of thes file system was copied to
|
||
* another storage device for backup. This information is usefu
|
||
*
|
||
* Sets the HrFSLastPartialBackupDate value.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* invalue address of value to set the variable
|
||
* outvalue address to return the set variable value
|
||
* access Reserved for future security use
|
||
* instance address of instance name as ordered native
|
||
* data type(s)
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* Standard PDU error codes.
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Successful get
|
||
* SNMP_ERRORSTATUS_BADVALUE Set value not in range
|
||
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
|
||
* mibtset.ntc v0.10
|
||
*/
|
||
|
||
UINT
|
||
SetHrFSLastPartialBackupDate(
|
||
IN DateAndTime *invalue ,
|
||
OUT DateAndTime *outvalue ,
|
||
IN Access_Credential *access ,
|
||
IN InstanceName *instance )
|
||
|
||
{
|
||
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
|
||
} /* end of SetHrFSLastPartialBackupDate() */
|
||
|
||
|
||
/*
|
||
* HrFSEntryFindInstance
|
||
*
|
||
* This routine is used to verify that the specified instance is
|
||
* valid.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* FullOid Address for the full oid - group, variable,
|
||
* and instance information
|
||
* instance Address for instance specification as an oid
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Instance found and valid
|
||
* SNMP_ERRORSTATUS_NOSUCHNAME Invalid instance
|
||
*
|
||
*/
|
||
|
||
UINT
|
||
HrFSEntryFindInstance( IN ObjectIdentifier *FullOid ,
|
||
IN OUT ObjectIdentifier *instance )
|
||
{
|
||
UINT tmp_instance ;
|
||
|
||
//
|
||
// Developer instrumentation code to find appropriate instance goes here.
|
||
// For non-tables, it is not necessary to modify this routine. However, if
|
||
// there is any context that needs to be set, it can be done here.
|
||
//
|
||
|
||
if ( FullOid->idLength <= HRFSENTRY_VAR_INDEX )
|
||
// No instance was specified
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
else if ( FullOid->idLength != HRFSENTRY_VAR_INDEX + 1 )
|
||
// Instance length is more than 1
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
else
|
||
// The only valid instance for a non-table are instance 0. If this
|
||
// is a non-table, the following code validates the instances. If this
|
||
// is a table, developer modification is necessary below.
|
||
|
||
tmp_instance = FullOid->ids[ HRFSENTRY_VAR_INDEX ] ;
|
||
|
||
/*
|
||
| For hrFSTable, the instance arc(s) is a single arc, and it must
|
||
| correctly select an entry in the hrFSTable cache.
|
||
| Check that here.
|
||
*/
|
||
if ( FindTableRow(tmp_instance, &hrFSTable_cache) == NULL ) {
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
}
|
||
else
|
||
{
|
||
// the instance is valid. Create the instance portion of the OID
|
||
// to be returned from this call.
|
||
instance->ids[ 0 ] = tmp_instance ;
|
||
instance->idLength = 1 ;
|
||
}
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of HrFSEntryFindInstance() */
|
||
|
||
|
||
|
||
/*
|
||
* HrFSEntryFindNextInstance
|
||
*
|
||
* This routine is called to get the next instance. If no instance
|
||
* was passed than return the first instance (1).
|
||
*
|
||
* Arguments:
|
||
*
|
||
* FullOid Address for the full oid - group, variable,
|
||
* and instance information
|
||
* instance Address for instance specification as an oid
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* SNMP_ERRORSTATUS_NOERROR Instance found and valid
|
||
* SNMP_ERRORSTATUS_NOSUCHNAME Invalid instance
|
||
*
|
||
*/
|
||
|
||
UINT
|
||
HrFSEntryFindNextInstance( IN ObjectIdentifier *FullOid ,
|
||
IN OUT ObjectIdentifier *instance )
|
||
{
|
||
//
|
||
// Developer supplied code to find the next instance of class goes here.
|
||
// If this is a class with cardinality 1, no modification of this routine
|
||
// is necessary unless additional context needs to be set.
|
||
// If the FullOid does not specify an instance, then the only instance
|
||
// of the class is returned. If this is a table, the first row of the
|
||
// table is returned.
|
||
//
|
||
// If an instance is specified and this is a non-table class, then NOSUCHNAME
|
||
// is returned so that correct MIB rollover processing occurs. If this is
|
||
// a table, then the next instance is the one following the current instance.
|
||
// If there are no more instances in the table, return NOSUCHNAME.
|
||
//
|
||
|
||
CACHEROW *row;
|
||
ULONG tmp_instance;
|
||
|
||
|
||
if ( FullOid->idLength <= HRFSENTRY_VAR_INDEX )
|
||
{
|
||
/*
|
||
| Too short: must return the instance arc that selects the first
|
||
| entry in the table if there is one.
|
||
*/
|
||
tmp_instance = 0;
|
||
}
|
||
else {
|
||
/*
|
||
| There is at least one instance arc. Even if it is the only arc
|
||
| we use it as the "index" in a request for the "NEXT" one.
|
||
*/
|
||
tmp_instance = FullOid->ids[ HRFSENTRY_VAR_INDEX ] ;
|
||
}
|
||
|
||
/* Now go off and try to find the next instance in the table */
|
||
if ((row = FindNextTableRow(tmp_instance, &hrFSTable_cache)) == NULL) {
|
||
return SNMP_ERRORSTATUS_NOSUCHNAME ;
|
||
}
|
||
|
||
instance->ids[ 0 ] = row->index ;
|
||
instance->idLength = 1 ;
|
||
|
||
return SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
} /* end of HrFSEntryFindNextInstance() */
|
||
|
||
|
||
|
||
/*
|
||
* HrFSEntryConvertInstance
|
||
*
|
||
* This routine is used to convert the object id specification of an
|
||
* instance into an ordered native representation. The object id format
|
||
* is that object identifier that is returned from the Find Instance
|
||
* or Find Next Instance routines. It is NOT the full object identifier
|
||
* that contains the group and variable object ids as well. The native
|
||
* representation is an argc/argv-like structure that contains the
|
||
* ordered variables that define the instance. This is specified by
|
||
* the MIB's INDEX clause. See RFC 1212 for information about the INDEX
|
||
* clause.
|
||
*
|
||
*
|
||
* Arguments:
|
||
*
|
||
* oid_spec Address of the object id instance specification
|
||
* native_spec Address to return the ordered native instance
|
||
* specification
|
||
*
|
||
* Return Codes:
|
||
*
|
||
* SUCCESS Conversion complete successfully
|
||
* FAILURE Unable to convert object id into native format
|
||
*
|
||
*/
|
||
|
||
UINT
|
||
HrFSEntryConvertInstance( IN ObjectIdentifier *oid_spec ,
|
||
IN OUT InstanceName *native_spec )
|
||
{
|
||
static char *array; /* The address of this (char *) is passed back */
|
||
/* as though it were an array of length 1 of these */
|
||
/* types. */
|
||
|
||
static ULONG inst; /* The address of this ULONG is passed back */
|
||
/* (Obviously, no "free()" action is needed) */
|
||
|
||
/* We only expect the one arc in "oid_spec" */
|
||
inst = oid_spec->ids[0];
|
||
array = (char *) &inst;
|
||
|
||
native_spec->count = 1;
|
||
native_spec->array = &array;
|
||
return SUCCESS ;
|
||
|
||
} /* end of HrFSEntryConvertInstance() */
|
||
|
||
|
||
|
||
|
||
/*
|
||
* HrFSEntryFreeInstance
|
||
*
|
||
* This routine is used to free an ordered native representation of an
|
||
* instance name.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* instance Address to return the ordered native instance
|
||
* specification
|
||
*
|
||
* Return Codes:
|
||
*
|
||
*
|
||
*/
|
||
|
||
void
|
||
HrFSEntryFreeInstance( IN OUT InstanceName *instance )
|
||
{
|
||
|
||
/* No action needed for hrFSTable */
|
||
} /* end of HrFSEntryFreeInstance() */
|
||
|
||
/*
|
||
| End of Generated Code
|
||
*/
|
||
|
||
/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */
|
||
/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */
|
||
/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */
|
||
|
||
BOOL
|
||
Gen_HrFSTable_Cache(
|
||
void
|
||
)
|
||
|
||
/*
|
||
| EXPLICIT INPUTS:
|
||
|
|
||
| None.
|
||
|
|
||
| IMPLICIT INPUTS:
|
||
|
|
||
| The module-local head of the cache for the HrFSTable,
|
||
| "hrFSTable_cache".
|
||
|
|
||
| OUTPUTS:
|
||
|
|
||
| On Success:
|
||
| Function returns TRUE indicating that the cache has been fully
|
||
| populated with all "static" cache-able values.
|
||
|
|
||
| On any Failure:
|
||
| Function returns FALSE (indicating "not enough storage").
|
||
|
|
||
| THE BIG PICTURE:
|
||
|
|
||
| At subagent startup time, the cache for each table in the MIB is
|
||
| populated with rows for each row in the table. This function is
|
||
| invoked by the start-up code in "UserMibInit()" ("MIB.C") to
|
||
| populate the cache for the HrStorage table.
|
||
|
|
||
| OTHER THINGS TO KNOW:
|
||
|
|
||
| There is one of these function for every table that has a cache.
|
||
| Each is found in the respective source file.
|
||
|
|
||
|=============== From WebEnable Design Spec Rev 3 04/11/97==================
|
||
| DISCUSSION:
|
||
|
|
||
| It appears that there is a one-to-one correspondence between NT logical drives
|
||
| and "file systems" as defined by this table. As a consequence, the contents
|
||
| of this table is almost identical to the hrStorageTable except that remote
|
||
| network drives (in unix-speak, remotely mounted file systems) are included
|
||
| in this table while excluded from hrStorageTable.
|
||
|
|
||
| To this end, a combination of Win32 API functions "GetLogicalDrives",
|
||
| "GetVolumeInformation", "GetDriveType" and "GetDiskFreeSpace" are used to
|
||
| acquire the information for the SNMP attributes in this table.
|
||
|
|
||
|============================================================================
|
||
| 1.3.6.1.2.1.25.3.8.1...
|
||
| | | |
|
||
| | | *hrFSEntry
|
||
| | *-hrFSTable
|
||
| *-hrDevice
|
||
|
|
||
*/
|
||
{
|
||
CHAR temp[8]; /* Temporary buffer for first call */
|
||
LPSTR pDrvStrings; /* --> allocated storage for drive strings */
|
||
LPSTR pOriginal_DrvStrings; /* (Needed for final deallocation */
|
||
DWORD DS_request_len; /* Storage actually needed */
|
||
DWORD DS_current_len; /* Storage used on 2nd call */
|
||
ULONG table_index=0; /* hrFSTable index counter */
|
||
CACHEROW *row; /* --> Cache structure for row-being built */
|
||
UINT i; /* Handy-Dandy loop index */
|
||
|
||
#define PHYS_SIZE 32
|
||
CHAR phys_name[PHYS_SIZE]; /* Buffer where a string like "\\.C:" (for */
|
||
/* example) is built for drive access. */
|
||
/*
|
||
| Blow away any old copy of the cache
|
||
*/
|
||
DestroyTable(&hrFSTable_cache);
|
||
|
||
/*
|
||
| We're going to call GetLogicalDriveStrings() twice, once to get the proper
|
||
| buffer size, and the second time to actually get the drive strings.
|
||
*/
|
||
if ((DS_request_len = GetLogicalDriveStrings(2, temp)) == 0) {
|
||
|
||
/* Request failed altogether, can't initialize */
|
||
return ( FALSE );
|
||
}
|
||
|
||
/*
|
||
| Grab enough storage for the drive strings plus one null byte at the end
|
||
*/
|
||
|
||
if ( (pOriginal_DrvStrings = pDrvStrings = malloc( (DS_request_len + 1) ) )
|
||
== NULL) {
|
||
|
||
/* Storage Request failed altogether, can't initialize */
|
||
return ( FALSE );
|
||
}
|
||
|
||
/* Go for all of the strings */
|
||
if ((DS_current_len = GetLogicalDriveStrings(DS_request_len, pDrvStrings))
|
||
== 0) {
|
||
|
||
/* Request failed altogether, can't initialize */
|
||
free( pOriginal_DrvStrings );
|
||
return ( FALSE );
|
||
}
|
||
|
||
|
||
/*
|
||
|==============================================================================
|
||
| As long as we've got an unprocessed drive-string which may correspond to
|
||
| a File-System for which we need a table-row entry . . .
|
||
*/
|
||
while ( strlen(pDrvStrings) > 0 ) {
|
||
|
||
UINT drivetype; /* Type of the drive from "GetDriveType()" */
|
||
ULONG fs_type; /* derived File-System type (last-arc value) */
|
||
UINT bootable; /* derived "bootable" value (Boolean) */
|
||
UINT readwrite; /* derived "readwrite" value (0 or 1) */
|
||
UINT storage_index; /* Index into hrStorageTable to matching slot*/
|
||
CACHEROW *row_hrstorage; /* As returned by FindNextTableRow() */
|
||
|
||
|
||
/*
|
||
| Get the drive-type so we can decide whether it should participate in
|
||
| this table. We do both locals and remotes (unlike hrStorage, from
|
||
| which this code was ripped off).
|
||
*/
|
||
drivetype = GetDriveType(pDrvStrings);
|
||
|
||
if ( drivetype == DRIVE_UNKNOWN
|
||
|| drivetype == DRIVE_NO_ROOT_DIR
|
||
) {
|
||
|
||
/* Step to next string, if any */
|
||
pDrvStrings += strlen(pDrvStrings) + 1;
|
||
|
||
continue;
|
||
}
|
||
|
||
/*
|
||
| OK, we want this one in the table, get a row-entry created.
|
||
*/
|
||
if ((row = CreateTableRow( HRFS_ATTRIB_COUNT ) ) == NULL) {
|
||
return ( FALSE ); // Out of memory
|
||
}
|
||
|
||
/* =========== hrFSIndex ==========*/
|
||
row->attrib_list[HRFS_INDEX].attrib_type = CA_NUMBER;
|
||
row->attrib_list[HRFS_INDEX].u.unumber_value = (table_index += 1) ;
|
||
|
||
|
||
/* =========== hrFSMountPoint ==========
|
||
| Note: We store the device string in the cache, but the "GET" function
|
||
| always returns an empty string, per the spec.
|
||
*/
|
||
row->attrib_list[HRFS_MOUNTPT].attrib_type = CA_STRING;
|
||
|
||
/* Get some space */
|
||
if ( (row->attrib_list[HRFS_MOUNTPT].u.string_value
|
||
= ( LPSTR ) malloc(strlen(pDrvStrings) + 1)) == NULL) {
|
||
return ( FALSE ); /* out of memory */
|
||
}
|
||
/* Copy the Value into the space */
|
||
strcpy(row->attrib_list[HRFS_MOUNTPT].u.string_value, pDrvStrings);
|
||
|
||
/*
|
||
| The GET functions for "computed" attributes expect to be able to use
|
||
| the value of the "hrFSMountPoint" cache value stored above to lookup
|
||
| (using system calls) their respective values. We may or may not actually
|
||
| report this stored-value as the value of the attribute in initial
|
||
| release.
|
||
*/
|
||
|
||
|
||
/* =========== hrFSRemoteMountPoint ==========*/
|
||
row->attrib_list[HRFS_RMOUNTPT].attrib_type = CA_COMPUTED;
|
||
|
||
|
||
/* =========== hrFSType ==========
|
||
| =========== hrFSAccess ==========
|
||
| =========== hrFSBootable ==========
|
||
|
|
||
| We use the first two characters of the drive string (e.g. "C:") to
|
||
| create the special string (e.g. "\\.\C:") needed to obtain a "CreateFile"
|
||
| handle to the device "C" or partition "C".
|
||
|
|
||
| With that, a DeviceIoControl call for partition information gives
|
||
| us an idea as to the type and bootability of the device or partition.
|
||
|
|
||
| If any step in this process fails, the type is "hrFSUnknown", bootable
|
||
| is "FALSE" and Access is presumed "read-write".
|
||
|
|
||
| For hrFSType we store a single number as the cached value of the
|
||
| hrFSType attribute. When this attribute is fetched, the cached number
|
||
| forms the last arc in the OBJECT IDENTIFIER that actually specifies the
|
||
| type: { hrFSTypes x }, where "x" is what gets stored.
|
||
*/
|
||
fs_type = 2; /* 2 = last arc value for "hrFSUnknown" */
|
||
bootable = 0; /* if unknown, "not bootable" */
|
||
readwrite = 1; /* if unknown, "read-write" */
|
||
|
||
/* If we have room in the buffer to build the handle-name string */
|
||
if ((strlen(pDrvStrings) + strlen("\\\\.\\")) < PHYS_SIZE) {
|
||
|
||
HANDLE hdrv; /* Handle to device */
|
||
PARTITION_INFORMATION part_info; /* Partition Info from device */
|
||
DWORD bytes_out; /* Bytes retnd into part_info */
|
||
|
||
|
||
/* Build it for device A: "\\.\A:" */
|
||
sprintf(phys_name, "\\\\.\\%2.2s", pDrvStrings);
|
||
|
||
/*
|
||
| Suppress any attempt by the system to make the user put a volume in a
|
||
| removable drive ("CreateFile" will just fail).
|
||
*/
|
||
SetErrorMode(SEM_FAILCRITICALERRORS);
|
||
|
||
/* Attempt to get a handle using this physical name string */
|
||
if ((hdrv = CreateFile(phys_name, // Device
|
||
GENERIC_READ, // Access
|
||
FILE_SHARE_READ |
|
||
FILE_SHARE_WRITE, // Share Mode
|
||
NULL, // Security
|
||
OPEN_EXISTING, // CreationDistribution
|
||
FILE_ATTRIBUTE_NORMAL, // FlagsandAttributes
|
||
NULL // Template file
|
||
)) != INVALID_HANDLE_VALUE) {
|
||
/*
|
||
| Device is Open
|
||
|
|
||
| Try for Partition Information on the "device" we opened
|
||
|
|
||
| (Not supported by Floppy drivers, so this'll probably fail).
|
||
*/
|
||
if (DeviceIoControl(hdrv, // device handle
|
||
// IoControlCode (op-code)
|
||
IOCTL_DISK_GET_PARTITION_INFO,
|
||
|
||
NULL, // "input buffer"
|
||
0, // "input buffer size"
|
||
&part_info, // "output buffer"
|
||
// "output buffer size"
|
||
sizeof(PARTITION_INFORMATION),
|
||
|
||
&bytes_out, // bytes written to part_info
|
||
NULL // no Overlapped I/o
|
||
)) {
|
||
|
||
/*
|
||
| We've got Partition Information for the device: use it
|
||
*/
|
||
bootable = part_info.BootIndicator;
|
||
|
||
/*
|
||
| Assign an OID Type "last-arc number" for those file system
|
||
| types we recognize.
|
||
*/
|
||
switch (part_info.PartitionType) {
|
||
|
||
case PARTITION_UNIX: // Unix
|
||
fs_type = 3; // "hrFSBerkeleyFFS"
|
||
break;
|
||
|
||
case PARTITION_FAT_12: // 12-bit FAT entries
|
||
case PARTITION_FAT_16: // 16-bit FAT entries
|
||
case PARTITION_HUGE: // Huge partition MS-DOS V4
|
||
case PARTITION_FAT32: // FAT32
|
||
case PARTITION_FAT32_XINT13: // FAT32 using extended int13 services
|
||
fs_type = 5; // "hrFSFat"
|
||
break;
|
||
|
||
case PARTITION_IFS: // IFS Partition
|
||
case VALID_NTFT: // NTFT uses high order bits
|
||
fs_type = 9; // "hrFSNTFS"
|
||
break;
|
||
|
||
case PARTITION_XENIX_1: // Xenix
|
||
case PARTITION_XENIX_2: // Xenix
|
||
case PARTITION_XINT13: // Win95 partition using extended int13 services
|
||
case PARTITION_XINT13_EXTENDED: // Same as type 5 but uses extended int13 services
|
||
case PARTITION_EXTENDED: // Extended partition entry
|
||
case PARTITION_PREP: // PowerPC Reference Platform (PReP) Boot Partition
|
||
fs_type = 1; // "hrFSOther"
|
||
break;
|
||
|
||
case PARTITION_ENTRY_UNUSED: // Entry unused
|
||
default:
|
||
/* This will translate to fs_type = 2 "unknown" */
|
||
break;
|
||
}
|
||
} /* If (we managed to get partition information) */
|
||
|
||
CloseHandle(hdrv);
|
||
} /* if (we managed to "CreateFile" the device) */
|
||
|
||
SetErrorMode(0); /* Turn error suppression mode off */
|
||
} /* if (we managed to build a device name) */
|
||
|
||
/* =========== hrFSType ========== */
|
||
row->attrib_list[HRFS_TYPE].attrib_type = CA_NUMBER;
|
||
row->attrib_list[HRFS_TYPE].u.unumber_value = fs_type;
|
||
|
||
|
||
/* =========== hrFSAccess ========== */
|
||
/* Quick check: if its a CD-ROM, we presume it is readonly */
|
||
if (drivetype == DRIVE_CDROM) {
|
||
readwrite = 2;
|
||
}
|
||
row->attrib_list[HRFS_ACCESS].attrib_type = CA_NUMBER;
|
||
row->attrib_list[HRFS_ACCESS].u.unumber_value = readwrite;
|
||
|
||
|
||
/* =========== hrFSBootable ========== */
|
||
row->attrib_list[HRFS_BOOTABLE].attrib_type = CA_NUMBER;
|
||
row->attrib_list[HRFS_BOOTABLE].u.unumber_value = bootable;
|
||
|
||
|
||
/* =========== hrFSStorageIndex ==========
|
||
| Strategy:
|
||
|
|
||
| We wander up the hrStorage table looking for an exact match between
|
||
| the storage attribute "hrStorageDescr" (which contains the DOS drive
|
||
| string as returned by GetLogicalDriveStrings()) and the current drive
|
||
| string.
|
||
|
|
||
| The first exact match: the index of that hrStorageTable row gets
|
||
| stored here as the value of "hrFSStorageIndex".
|
||
|
|
||
| No Match: Store zero per the RFC spec.
|
||
|
|
||
| Come PnP, this attribute has to become "computed", as entries may come
|
||
| and go from the hrStorage table.
|
||
|
|
||
| NOTE: The length of the comparison of the match is limited by the
|
||
| drive string we generate in this function, as the "description"
|
||
| from the hrStorage table may have other stuff appended to the
|
||
| end of the drive-string.
|
||
*/
|
||
row->attrib_list[HRFS_STORINDX].attrib_type = CA_NUMBER;
|
||
storage_index = 0; /* Presume failure */
|
||
|
||
/* Scan the hrStorageTable cache */
|
||
for (row_hrstorage = FindNextTableRow(0, &hrStorage_cache);
|
||
row_hrstorage != NULL;
|
||
row_hrstorage = FindNextTableRow(i, &hrStorage_cache)
|
||
) {
|
||
|
||
/* Obtain the actual row index */
|
||
i = row_hrstorage->index;
|
||
|
||
/* If (this entry has an exact match on drive-strings) */
|
||
if (strncmp(row_hrstorage->attrib_list[HRST_DESCR].u.string_value,
|
||
pDrvStrings,strlen(pDrvStrings)) == 0) {
|
||
|
||
/* We found a match, record it and break out */
|
||
storage_index = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
row->attrib_list[HRFS_STORINDX].u.unumber_value = storage_index;
|
||
|
||
|
||
/* =========== hrFSLastFullBackupDate ==========*/
|
||
row->attrib_list[HRFS_LASTFULL].attrib_type = CA_COMPUTED;
|
||
|
||
|
||
/* =========== hrFSLastPartialBackupDate ==========*/
|
||
row->attrib_list[HRFS_LASTPART].attrib_type = CA_COMPUTED;
|
||
|
||
|
||
/*
|
||
| ======================================================
|
||
| Now insert the filled-in CACHEROW structure into the
|
||
| cache-list for the hrFSTable.
|
||
*/
|
||
if (AddTableRow(row->attrib_list[HRFS_INDEX].u.unumber_value, /* Index */
|
||
row, /* Row */
|
||
&hrFSTable_cache /* Cache */
|
||
) == FALSE) {
|
||
return ( FALSE ); /* Internal Logic Error! */
|
||
}
|
||
|
||
/* Step to next string, if any */
|
||
pDrvStrings += strlen(pDrvStrings) + 1;
|
||
|
||
} /* while (drive-strings remain . . .) */
|
||
|
||
|
||
free( pOriginal_DrvStrings );
|
||
|
||
|
||
#if defined(CACHE_DUMP)
|
||
PrintCache(&hrFSTable_cache);
|
||
#endif
|
||
|
||
|
||
/*
|
||
| Initialization of this table's cache succeeded
|
||
*/
|
||
|
||
return (TRUE);
|
||
}
|
||
|
||
|
||
/* PartitionTypeToLastArc - Convert Partition Type to Last OID Arc value */
|
||
/* PartitionTypeToLastArc - Convert Partition Type to Last OID Arc value */
|
||
/* PartitionTypeToLastArc - Convert Partition Type to Last OID Arc value */
|
||
|
||
ULONG
|
||
PartitionTypeToLastArc (
|
||
BYTE p_type
|
||
)
|
||
/*
|
||
| EXPLICIT INPUTS:
|
||
|
|
||
| Disk Partition Type as returned in PARTITION_INFORMATINO
|
||
|
|
||
| IMPLICIT INPUTS:
|
||
|
|
||
| None.
|
||
|
|
||
| OUTPUTS:
|
||
|
|
||
| On Success:
|
||
| Function returns the value that should be used as the Last-Arc "x"
|
||
| in a "hrFSTypes" Object Identifier.
|
||
|
|
||
| On any Failure:
|
||
| Function returns the last-arc value for "UNKNOWN".
|
||
|
|
||
| THE BIG PICTURE:
|
||
|
|
||
| In more than one spot we need to be able to translate from
|
||
| a Partition Type to our "Last-Arc" value.
|
||
|
|
||
| OTHER THINGS TO KNOW:
|
||
|
|
||
*/
|
||
{
|
||
ULONG last_arc = 2; /* "2" = "UNKNOWN" */
|
||
|
||
/*
|
||
| Assign an OID Type "last-arc number" for those file system
|
||
| types we recognize.
|
||
*/
|
||
switch ( p_type ) {
|
||
|
||
case PARTITION_UNIX: // Unix
|
||
last_arc = 3; // "hrFSBerkeleyFFS"
|
||
break;
|
||
|
||
case PARTITION_FAT_12: // 12-bit FAT entries
|
||
case PARTITION_FAT_16: // 16-bit FAT entries
|
||
case PARTITION_HUGE: // Huge partition MS-DOS V4
|
||
case PARTITION_FAT32: // FAT32
|
||
case PARTITION_FAT32_XINT13: // FAT32 using extended int13 services
|
||
last_arc = 5; // "hrFSFat"
|
||
break;
|
||
|
||
case PARTITION_IFS: // IFS Partition
|
||
case VALID_NTFT: // NTFT uses high order bits
|
||
last_arc = 9; // "hrFSNTFS"
|
||
break;
|
||
|
||
case PARTITION_XENIX_1: // Xenix
|
||
case PARTITION_XENIX_2: // Xenix
|
||
case PARTITION_XINT13: // Win95 partition using extended int13 services
|
||
case PARTITION_XINT13_EXTENDED: // Same as type 5 but uses extended int13 services
|
||
case PARTITION_EXTENDED: // Extended partition entry
|
||
case PARTITION_PREP: // PowerPC Reference Platform (PReP) Boot Partition
|
||
last_arc = 1; // "hrFSOther"
|
||
break;
|
||
|
||
case PARTITION_ENTRY_UNUSED: // Entry unused
|
||
default:
|
||
/* This will translate to "unknown" */
|
||
break;
|
||
}
|
||
|
||
return ( last_arc );
|
||
}
|
||
|
||
#if defined(CACHE_DUMP)
|
||
|
||
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
|
||
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
|
||
/* debug_print_hrFSTable - Prints a Row from HrFSTable sub-table */
|
||
|
||
static void
|
||
debug_print_hrFSTable(
|
||
CACHEROW *row /* Row in hrFSTable table */
|
||
)
|
||
/*
|
||
| EXPLICIT INPUTS:
|
||
|
|
||
| "row" - points to the row to be dumped, if NULL, the function
|
||
| merely prints a suitable title.
|
||
|
|
||
| IMPLICIT INPUTS:
|
||
|
|
||
| - Symbols used to reference the attributes in the row entry.
|
||
| - File handle defined by OFILE, presumed to be open.
|
||
|
|
||
| OUTPUTS:
|
||
|
|
||
| On Success:
|
||
| Function prints a dump of the row in ASCII for debugging purposes
|
||
| on file handle OFILE.
|
||
|
|
||
| THE BIG PICTURE:
|
||
|
|
||
| Debugging only.
|
||
|
|
||
| OTHER THINGS TO KNOW:
|
||
*/
|
||
{
|
||
|
||
if (row == NULL) {
|
||
fprintf(OFILE, "=====================\n");
|
||
fprintf(OFILE, "hrFSTable Table Cache\n");
|
||
fprintf(OFILE, "=====================\n");
|
||
return;
|
||
}
|
||
|
||
|
||
fprintf(OFILE, "hrFSIndex. . . . . . . . %d\n",
|
||
row->attrib_list[HRFS_INDEX].u.unumber_value);
|
||
|
||
fprintf(OFILE, "hrFSMountPoint . . . . . \"%s\" (ALWAYS RETURNED AS EMPTY STRING) \n",
|
||
row->attrib_list[HRFS_MOUNTPT].u.string_value);
|
||
|
||
fprintf(OFILE, "hrFSRemoteMountPoint . . \"%s\"\n",
|
||
row->attrib_list[HRFS_RMOUNTPT].u.string_value);
|
||
|
||
fprintf(OFILE, "hrFSType . . . . . . . . %d ",
|
||
row->attrib_list[HRFS_TYPE].u.unumber_value);
|
||
|
||
switch (row->attrib_list[HRFS_TYPE].u.unumber_value) {
|
||
case 1: fprintf(OFILE, "(hrFSOther)\n"); break;
|
||
case 2: fprintf(OFILE, "(hrFSUnknown)\n"); break;
|
||
case 3: fprintf(OFILE, "(hrFSBerkeleyFFS)\n"); break;
|
||
case 5: fprintf(OFILE, "(hrFSFat)\n"); break;
|
||
case 9: fprintf(OFILE, "(hrFSNTFS)\n"); break;
|
||
default:
|
||
fprintf(OFILE, "(???)\n");
|
||
}
|
||
|
||
|
||
fprintf(OFILE, "hrFSAccess . . . . . . . %d ",
|
||
row->attrib_list[HRFS_ACCESS].u.number_value);
|
||
switch (row->attrib_list[HRFS_ACCESS].u.unumber_value) {
|
||
case 1: fprintf(OFILE, "(readWrite)\n"); break;
|
||
case 2: fprintf(OFILE, "(readOnly)\n"); break;
|
||
default:
|
||
fprintf(OFILE, "(???)\n"); break;
|
||
}
|
||
|
||
|
||
fprintf(OFILE, "hrFSBootable . . . . . . %d ",
|
||
row->attrib_list[HRFS_BOOTABLE].u.number_value);
|
||
|
||
switch (row->attrib_list[HRFS_BOOTABLE].u.unumber_value) {
|
||
case 0: fprintf(OFILE, "(FALSE)\n"); break;
|
||
case 1: fprintf(OFILE, "(TRUE)\n"); break;
|
||
default:
|
||
fprintf(OFILE, "(???)\n"); break;
|
||
}
|
||
|
||
fprintf(OFILE, "hrFSStorageIndex . . . . %d\n",
|
||
row->attrib_list[HRFS_STORINDX].u.number_value);
|
||
}
|
||
#endif
|