//*************************************************************************** // // main.c // // Module: Windows HBA API implmentation // // Purpose: Contains DLL entry points and main HBA api functions // // Copyright (c) 2001 Microsoft Corporation // //*************************************************************************** #include "hbaapip.h" #include //*************************************************************************** // // LibMain32 // // Purpose: Entry point for DLL. // // Return: TRUE if OK. // //*************************************************************************** HANDLE Module; BOOL WINAPI LibMain32( HINSTANCE Instance, ULONG Reason, LPVOID pvReserved ) { if (DLL_PROCESS_ATTACH==Reason) { Mutex = CreateMutex(NULL, FALSE, NULL); if (Mutex == NULL) { return(FALSE); } Module = Instance; DisableThreadLibraryCalls(Module); } return(TRUE); } // // Main HBA Apis // HBA_STATUS HBA_API HBA_RegisterLibrary( PHBA_ENTRYPOINTS entrypoints ) { return(HBA_STATUS_ERROR_NOT_SUPPORTED); } HBA_UINT32 HBA_API HBA_GetVersion( void ) { return(HBA_VERSION); } HBA_STATUS HBA_API HBA_LoadLibrary( ) { return(HBA_STATUS_OK); } HBA_STATUS HBA_API HBA_FreeLibrary( void ) { return(HBA_STATUS_OK); } HBA_UINT32 HBA_API HBA_GetNumberOfAdapters( void ) { HANDLE Handle; PWNODE_ALL_DATA Buffer; ULONG Count = 0; ULONG Status; Status = WmiOpenBlock((LPGUID)&MSFC_FCAdapterHBAAttributes_GUID, GENERIC_READ, &Handle); if (Status == ERROR_SUCCESS) { Status = QueryAllData(Handle, &Buffer); if (Status == ERROR_SUCCESS) { Status = ParseAllData(Buffer, &Count, NULL, NULL, NULL), FreeMemory(Buffer); } WmiCloseBlock(Handle); } return( Count ); } HBA_STATUS HBA_GetAdapterNameW( IN HBA_UINT32 AdapterIndex, OUT PWCHAR AdapterName ) { HANDLE Handle; PWNODE_ALL_DATA Buffer; HBA_STATUS HbaStatus = HBA_STATUS_ERROR; ULONG Count; ULONG Len; PWCHAR Name; ULONG Status; PUSHORT *InstanceNames; Status = WmiOpenBlock((LPGUID)&MSFC_FCAdapterHBAAttributes_GUID, GENERIC_READ, &Handle); if (Status == ERROR_SUCCESS) { Status = QueryAllData(Handle, &Buffer); if (Status == ERROR_SUCCESS) { Status = ParseAllData(Buffer, &Count, &InstanceNames, NULL, NULL); if (Status == ERROR_SUCCESS) { if (AdapterIndex < Count) { Name = InstanceNames[AdapterIndex]; Len = *Name++; wcsncpy(AdapterName, Name, Len/sizeof(WCHAR)); AdapterName[Len] = 0; HbaStatus = HBA_STATUS_OK; } FreeMemory(InstanceNames); } FreeMemory(Buffer); } WmiCloseBlock(Handle); } return(HbaStatus); } HBA_STATUS HBA_API HBA_GetAdapterName( IN HBA_UINT32 AdapterIndex, OUT PCHAR AdapterName ) { WCHAR AdapterNameW[256]; HBA_STATUS HbaStatus; ULONG Status; HbaStatus = HBA_GetAdapterNameW(AdapterIndex, AdapterNameW); if (HbaStatus == HBA_STATUS_OK) { Status = UnicodeToAnsi(AdapterNameW, AdapterName, 256); if (Status != ERROR_SUCCESS) { HbaStatus = HBA_STATUS_ERROR; } } return(HbaStatus); } HBA_HANDLE HBA_OpenAdapterW( PWCHAR AdapterName ) { HBA_HANDLE HbaHandle = 0; HANDLE Handle; PADAPTER_HANDLE HandleData; ULONG Status; PWNODE_SINGLE_INSTANCE Buffer; Status = WmiOpenBlock((LPGUID)&MSFC_FCAdapterHBAAttributes_GUID, GENERIC_READ, &Handle); if (Status == ERROR_SUCCESS) { // // Validate adapter name by querying for that adapter name as a // WMI instance name // Status = QuerySingleInstance(Handle, AdapterName, &Buffer); if (Status == ERROR_SUCCESS) { // // If it exists then we allocate an adapter handle data // structure and insert it on the list of open adapter // handles // HandleData = AllocMemory(sizeof(ADAPTER_HANDLE)); if (HandleData != NULL) { memset(HandleData, 0, sizeof(ADAPTER_HANDLE)); HandleData->InstanceName = AllocMemory((wcslen(AdapterName) + 1) * sizeof(WCHAR)); if (HandleData->InstanceName != NULL) { wcscpy(HandleData->InstanceName, AdapterName); EnterCritSection(); HandleData->HbaHandle = HbaHandleCounter++; InsertHeadList(&HbaHandleList, &HandleData->List); LeaveCritSection(); HbaHandle = HandleData->HbaHandle; } else { FreeMemory(HandleData); } } FreeMemory(Buffer); } WmiCloseBlock(Handle); } return(HbaHandle); } HBA_HANDLE HBA_API HBA_OpenAdapter( PCHAR AdapterName ) { PWCHAR AdapterNameW; ULONG Len, AllocLen; ULONG Status; HBA_HANDLE HbaHandle; Len = strlen(AdapterName) + 1; AllocLen = Len * sizeof(WCHAR); AdapterNameW = AllocMemory(AllocLen); if (AdapterNameW != NULL) { Status = AnsiToUnicode(AdapterName, AdapterNameW, Len); HbaHandle = HBA_OpenAdapterW(AdapterNameW); FreeMemory(AdapterNameW); } return(HbaHandle); } void HBA_API HBA_CloseAdapter( HBA_HANDLE HbaHandle ) { PADAPTER_HANDLE HandleData; HandleData = GetDataByHandle(HbaHandle); if (HandleData != NULL) { EnterCritSection(); RemoveEntryList(&HandleData->List); LeaveCritSection(); FreeMemory(HandleData->InstanceName); FreeMemory(HandleData); } } #if DBG ULONG HbaapiDebugSpew = 1; VOID HbaapiDebugPrint( PCHAR DebugMessage, ... ) /*++ Routine Description: Debug print for properties pages - stolen from classpnp\class.c Arguments: Debug print level between 0 and 3, with 3 being the most verbose. Return Value: None --*/ { CHAR SpewBuffer[DEBUG_BUFFER_LENGTH]; va_list ap; va_start(ap, DebugMessage); if (HbaapiDebugSpew) { _vsnprintf(SpewBuffer, DEBUG_BUFFER_LENGTH, DebugMessage, ap); OutputDebugStringA(SpewBuffer); } va_end(ap); } // end WmiDebugPrint() #endif