|
|
#include "precomp.h"
#pragma hdrstop
extern CHAR ReturnTextBuffer[1024];
/*
GetEisaSlotInformation - Get EISA information. The user must passed 3 arguments to the function. 1st argument - bus number 2nd argument - registry field name, i.e. "Configuration Data" 3rd argument - Compressed ID. 4th argument - Compressed ID Mask. (optional)
The function will look through the bus's configuration data value and return a list of slot number which contains the hardware with the same compressed ID. */
BOOL GetEisaSlotInformation( IN DWORD cArgs, IN LPSTR Args[], OUT LPSTR *TextOut )
{ PCM_FULL_RESOURCE_DESCRIPTOR pFullResourceDescriptor; PCM_PARTIAL_RESOURCE_DESCRIPTOR pPartialDescriptor;
ULONG ulID; DWORD dwMask = 0xffffff; BOOL fFirst = TRUE; CHAR szNum[10];
BOOL fOkay; HKEY hKey; DWORD cbData; DWORD ValueType; PVOID ValueData; LONG Status;
char szKClass[ MAX_PATH ]; DWORD cbKClass; DWORD KSubKeys; DWORD cbKMaxSubKeyLen; DWORD cbKMaxClassLen; DWORD KValues; DWORD cbKMaxValueNameLen; DWORD SizeSecurityDescriptor; FILETIME KLastWriteTime;
USHORT Count = 0; UCHAR Function, Slot = 0; PCM_EISA_SLOT_INFORMATION SlotInformation; ULONG DataLength; PUCHAR DataPointer,EndingAddress, BinaryPointer = NULL;
/*
* Make sure we have 4 variables */ if ( cArgs < 3 ) { SetErrorText(IDS_ERROR_BADARGS); return( FALSE ); }
ulID = atol( Args[2] ); if ( cArgs > 3 ) { dwMask = atol( Args[3] ); }
lstrcpy( ReturnTextBuffer, "{" );
hKey = (HKEY)LongToHandle(atol( &(Args[0][1]) ));
cbKClass = MAX_PATH;
/*
** Get the registry handle information */ fOkay = !( Status = RegQueryInfoKey ( hKey, szKClass, &cbKClass, NULL, &KSubKeys, &cbKMaxSubKeyLen, &cbKMaxClassLen, &KValues, &cbKMaxValueNameLen, &cbData, &SizeSecurityDescriptor, &KLastWriteTime ) );
if ( !fOkay ) { lstrcat( ReturnTextBuffer, "}" ); *TextOut = ReturnTextBuffer; OutputDebugString("RegQueryInfoKey error.\n\r"); return(FALSE);
} else {
//
// Allocate the buffer and get the data
//
// add some space for the margin
while ( (ValueData = (PVOID)SAlloc( (CB)( cbData+10 ))) == NULL ) { lstrcat( ReturnTextBuffer, "}" ); *TextOut = ReturnTextBuffer; OutputDebugString("Malloc error.\n\r"); return(FALSE); }
if ( fOkay ) {
fOkay = !( Status = RegQueryValueEx( hKey, Args[1], NULL, &ValueType, ValueData, &cbData ) ); if ( !fOkay ) { SFree( ValueData ); lstrcat( ReturnTextBuffer, "}" ); *TextOut = ReturnTextBuffer; OutputDebugString("RegQueryValueEx error.\n\r"); return(FALSE);
} }
}
pFullResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR) ValueData; if ( pFullResourceDescriptor->PartialResourceList.Count != 0 ) { pPartialDescriptor = ( PCM_PARTIAL_RESOURCE_DESCRIPTOR ) &pFullResourceDescriptor->PartialResourceList.PartialDescriptors;
DataPointer = (PUCHAR)pPartialDescriptor + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); DataLength = pPartialDescriptor->u.DeviceSpecificData.DataSize;
if ( DataLength != 0 ) {
/*
** Go through the data one by one to find the compressed ID */ EndingAddress = DataPointer + DataLength; SlotInformation = (PCM_EISA_SLOT_INFORMATION)DataPointer; while ((ULONG_PTR)BinaryPointer < (ULONG_PTR)EndingAddress) { if (SlotInformation->ReturnCode != EISA_EMPTY_SLOT) { BinaryPointer = (PUCHAR)SlotInformation; if (( SlotInformation->CompressedId & dwMask ) == ulID ) { if (!fFirst) { lstrcat( ReturnTextBuffer,"," ); } fFirst = FALSE; wsprintf( szNum, "\"%d\"", Slot ); lstrcat( ReturnTextBuffer, szNum ); OutputDebugString(ReturnTextBuffer); } BinaryPointer += sizeof(CM_EISA_SLOT_INFORMATION); Function = 0; while (SlotInformation->NumberFunctions > Function) { BinaryPointer += sizeof(CM_EISA_FUNCTION_INFORMATION); Function++; } } else { BinaryPointer += sizeof(CM_EISA_SLOT_INFORMATION); } Slot++; SlotInformation = (PCM_EISA_SLOT_INFORMATION)BinaryPointer; } } } lstrcat( ReturnTextBuffer, "}" ); *TextOut = ReturnTextBuffer; SFree( ValueData );
return TRUE; }
|