/*++ Copyright (c) 1998 Microsoft Corporation Module Name: hash.h Abstract: Replacement routines for the string table functions in setupapi.dll. These routines are much more easy to work with. Author: Jim Schmidt (jimschm) 22-Dec-1998 Revision History: jimschm 25-Jul-2001 Minor coding convention fixups ovidiut 11-Oct-1999 Updated for new coding conventions and Win64 compliance --*/ #pragma once #ifdef __cplusplus extern "C" { /* Assume C declarations for C++ */ #endif /* __cplusplus */ // // Macros // #define CASE_SENSITIVE TRUE #define CASE_INSENSITIVE FALSE #define UNKNOWN_LETTER_CASE FALSE #define ALREADY_LOWERCASE TRUE #define DEFAULT_BUCKET_SIZE 0 // // Types // typedef const void *HASHTABLE; typedef const void *HASHITEM; typedef struct { PCSTR String; PCVOID ExtraData; HASHITEM Index; HASHTABLE Internal; } HASHTABLE_ENUMA, *PHASHTABLE_ENUMA; typedef struct { PCWSTR String; PCVOID ExtraData; HASHITEM Index; HASHTABLE Internal; } HASHTABLE_ENUMW, *PHASHTABLE_ENUMW; typedef BOOL (*PHASHTABLE_CALLBACK_ROUTINEA)( IN HASHTABLE HashTable, IN HASHITEM Index, IN PCSTR String, IN PVOID ExtraData, IN UINT ExtraDataSize, IN LPARAM lParam ); typedef BOOL (*PHASHTABLE_CALLBACK_ROUTINEW)( IN HASHTABLE HashTable, IN HASHITEM Index, IN PCWSTR String, IN PVOID ExtraData, IN UINT ExtraDataSize, IN LPARAM lParam ); // // Function prototypes and wrapper macros // HASHTABLE RealHtAllocExAW ( IN BOOL CaseSensitive, IN BOOL Unicode, IN BOOL ExternalStrings, IN UINT ExtraDataSize, IN UINT BucketCount OPTIONAL ); DBGTRACK_DECLARE(HASHTABLE) #define HtAllocExAW(cs,u,s,d,b) DBGTRACK_BEGIN(HASHTABLE, HtAllocExAW)\ RealHtAllocExAW(cs,u,s,d,b)\ DBGTRACK_END() #define HtAllocA() HtAllocExAW(FALSE,FALSE,FALSE,0,0) #define HtAllocW() HtAllocExAW(FALSE,TRUE,FALSE,0,0) #define HtAllocWithDataA(size) HtAllocExAW(FALSE,FALSE,FALSE,size,0) #define HtAllocWithDataW(size) HtAllocExAW(FALSE,TRUE,FALSE,size,0) #define HtAllocExA(cs,datasize,bucketcount) HtAllocExAW(cs,FALSE,FALSE,datasize,bucketcount) #define HtAllocExW(cs,datasize,bucketcount) HtAllocExAW(cs,TRUE,FALSE,datasize,bucketcount) #define HtAllocExternStrA() HtAllocExAW(FALSE,FALSE,TRUE,0,0) #define HtAllocExternStrW() HtAllocExAW(FALSE,TRUE,TRUE,0,0) #define HtAllocExternStrWithDataA(size) HtAllocExAW(FALSE,FALSE,TRUE,0,0) #define HtAllocExternStrWithDataW(size) HtAllocExAW(FALSE,TRUE,TRUE,0,0) #define HtAllocExternStrExA(cs,size,bucketcount) HtAllocExAW(cs,FALSE,TRUE,size,bucketcount) #define HtAllocExternStrExW(cs,size,bucketcount) HtAllocExAW(cs,TRUE,TRUE,size,bucketcount) VOID HtFree ( IN HASHTABLE HashTable ); HASHITEM HtAddStringExA ( IN HASHTABLE HashTable, IN PCSTR String, IN PCVOID ExtraData, OPTIONAL IN BOOL AlreadyLowercase ); #define HtAddStringA(table,string) HtAddStringExA(table,string,NULL,UNKNOWN_LETTER_CASE) #define HtAddStringAndDataA(table,string,data) HtAddStringExA(table,string,data,UNKNOWN_LETTER_CASE) HASHITEM HtAddStringExW ( IN HASHTABLE HashTable, IN PCWSTR String, IN PCVOID ExtraData, OPTIONAL IN BOOL AlreadyLowercase ); #define HtAddStringW(table,string) HtAddStringExW(table,string,NULL,UNKNOWN_LETTER_CASE) #define HtAddStringAndDataW(table,string,data) HtAddStringExW(table,string,data,UNKNOWN_LETTER_CASE) BOOL HtRemoveItem ( IN HASHTABLE HashTable, IN HASHITEM Item ); BOOL HtRemoveStringA ( IN HASHTABLE HashTable, IN PCSTR AnsiString ); BOOL HtRemoveStringW ( IN HASHTABLE HashTable, IN PCWSTR UnicodeString ); HASHITEM HtFindStringExA ( IN HASHTABLE HashTable, IN PCSTR String, OUT PVOID ExtraData, OPTIONAL IN BOOL AlreadyLowercase ); #define HtFindStringA(table,string) HtFindStringExA(table,string,NULL,UNKNOWN_LETTER_CASE) #define HtFindStringAndDataA(table,string,data) HtFindStringExA(table,string,data,UNKNOWN_LETTER_CASE) HASHITEM HtFindStringExW ( IN HASHTABLE HashTable, IN PCWSTR String, OUT PVOID ExtraData, OPTIONAL IN BOOL AlreadyLowercase ); #define HtFindStringW(table,string) HtFindStringExW(table,string,NULL,UNKNOWN_LETTER_CASE) #define HtFindStringAndDataW(table,string,data) HtFindStringExW(table,string,data,UNKNOWN_LETTER_CASE) HASHITEM HtFindPrefixExA ( IN HASHTABLE HashTable, IN PCSTR StringStart, IN PCSTR BufferEnd, OUT PVOID ExtraData, OPTIONAL IN BOOL AlreadyLowercase ); #define HtFindPrefixA(table,str,end) HtFindPrefixExA(table,str,end,NULL,UNKNOWN_LETTER_CASE) HASHITEM HtFindPrefixExW ( IN HASHTABLE HashTable, IN PCWSTR StringStart, IN PCWSTR BufferEnd, OUT PVOID ExtraData, OPTIONAL IN BOOL AlreadyLowercase ); #define HtFindPrefixW(table,str,end) HtFindPrefixExW(table,str,end,NULL,UNKNOWN_LETTER_CASE) BOOL HtGetExtraData ( IN HASHTABLE HashTable, IN HASHITEM Index, OUT PCVOID *ExtraData ); BOOL HtCopyStringData ( IN HASHTABLE HashTable, IN HASHITEM Index, OUT PVOID ExtraData ); BOOL HtSetStringData ( IN HASHTABLE HashTable, IN HASHITEM Index, IN PCVOID ExtraData ); PCSTR HtGetStringFromItemA ( IN HASHITEM Index ); PCWSTR HtGetStringFromItemW ( IN HASHITEM Index ); BOOL HtEnumFirstStringA ( OUT PHASHTABLE_ENUMA EnumPtr, IN HASHTABLE HashTable ); BOOL HtEnumFirstStringW ( OUT PHASHTABLE_ENUMW EnumPtr, IN HASHTABLE HashTable ); BOOL HtEnumNextStringA ( IN OUT PHASHTABLE_ENUMA EnumPtr ); BOOL HtEnumNextStringW ( IN OUT PHASHTABLE_ENUMW EnumPtr ); BOOL HtEnumWithCallbackA ( IN HASHTABLE Table, IN PHASHTABLE_CALLBACK_ROUTINEA Proc, IN LPARAM lParam ); BOOL HtEnumWithCallbackW ( IN HASHTABLE Table, IN PHASHTABLE_CALLBACK_ROUTINEW Proc, IN LPARAM lParam ); // // A & W macros // #ifdef UNICODE #define HASHTABLE_ENUM HASHTABLE_ENUMW #define PHASHTABLE_ENUM PHASHTABLE_ENUMW #define PHASH_CALLBACK_ROUTINE PHASH_CALLBACK_ROUTINEW #define HtAlloc HtAllocW #define HtAllocWithData HtAllocWithDataW #define HtAllocEx HtAllocExW #define HtAllocExternStr HtAllocExternStrW #define HtAllocExternStrWithData HtAllocExternStrWithDataW #define HtAllocExternStrEx HtAllocExternStrExW #define HtAddString HtAddStringW #define HtAddStringAndData HtAddStringAndDataW #define HtAddStringEx HtAddStringExW #define HtRemoveString HtRemoveStringW #define HtFindString HtFindStringW #define HtFindStringAndData HtFindStringAndDataW #define HtFindStringEx HtFindStringExW #define HtFindPrefix HtFindPrefixW #define HtFindPrefixEx HtFindPrefixExW #define HtGetStringFromItem HtGetStringFromItemW #define HtEnumFirstString HtEnumFirstStringW #define HtEnumNextString HtEnumNextStringW #define HtEnumWithCallback HtEnumWithCallbackW #else #define HASHTABLE_ENUM HASHTABLE_ENUMA #define PHASHTABLE_ENUM PHASHTABLE_ENUMA #define PHASH_CALLBACK_ROUTINE PHASH_CALLBACK_ROUTINEA #define HtAlloc HtAllocA #define HtAllocWithData HtAllocWithDataA #define HtAllocEx HtAllocExA #define HtAllocExternStr HtAllocExternStrA #define HtAllocExternStrWithData HtAllocExternStrWithDataA #define HtAllocExternStrEx HtAllocExternStrExA #define HtAddString HtAddStringA #define HtAddStringAndData HtAddStringAndDataA #define HtAddStringEx HtAddStringExA #define HtRemoveString HtRemoveStringA #define HtFindString HtFindStringA #define HtFindStringAndData HtFindStringAndDataA #define HtFindStringEx HtFindStringExA #define HtFindPrefix HtFindPrefixA #define HtFindPrefixEx HtFindPrefixExA #define HtGetStringFromItem HtGetStringFromItemA #define HtEnumFirstString HtEnumFirstStringA #define HtEnumNextString HtEnumNextStringA #define HtEnumWithCallback HtEnumWithCallbackA #endif #ifdef __cplusplus } #endif /* __cplusplus */