NTSTATUS UnhookDriverObject(PDRIVER_HOOK_RECORD DriverRecord) { KIRQL irql; PHASH_ITEM h = NULL; NTSTATUS status = STATUS_UNSUCCESSFUL; DEBUG_ENTER_FUNCTION("DriverRecord=0x%p", DriverRecord); KeAcquireSpinLock(&_driverTableLock, &irql); h = HashTableDelete(_driverTable, DriverRecord->DriverObject); if (h != NULL) { KeReleaseSpinLock(&_driverTableLock, irql); if (DriverRecord->MonitoringEnabled) { _UnhookDriverObject(DriverRecord); DriverRecord->MonitoringEnabled = FALSE; } KeAcquireSpinLock(&DriverRecord->SelectedDevicesLock, &irql); HashTableClear(DriverRecord->SelectedDevices, TRUE); KeReleaseSpinLock(&DriverRecord->SelectedDevicesLock, irql); _InvalidateDriverHookRecord(DriverRecord); DriverHookRecordDereference(DriverRecord); status = STATUS_SUCCESS; } else { KeReleaseSpinLock(&_driverTableLock, irql); status = STATUS_NOT_FOUND; ASSERT(FALSE); } DEBUG_EXIT_FUNCTION("0x%x", status); return status; }
HashTable* HashTableCreate ( int _initialSize ) { HashTable * pNewHT = new HashTable; pNewHT->m_tableSize = _initialSize; pNewHT->m_pData = new HashTable::Element[ pNewHT->m_tableSize ]; HashTableClear( * pNewHT ); return pNewHT; }
VOID HandleTableClear(PCHANDLE_TABLE HandleTable) { KIRQL irql; DEBUG_ENTER_FUNCTION("Handletable=0x%p", HandleTable); _HandleTableLockExclusive(HandleTable, &irql); HashTableClear(HandleTable->HashTable, TRUE); _HandleTableUnlock(HandleTable, irql); DEBUG_EXIT_FUNCTION_VOID(); return; }
static VOID _DriverFreeFunction(PHASH_ITEM HashItem) { PDRIVER_HOOK_RECORD r = CONTAINING_RECORD(HashItem, DRIVER_HOOK_RECORD, HashItem); DEBUG_ENTER_FUNCTION("HashItem=0x%p", HashItem); if (r->MonitoringEnabled) { _UnhookDriverObject(r); r->MonitoringEnabled = FALSE; } HashTableClear(r->SelectedDevices, TRUE); DriverHookRecordDereference(r); DEBUG_EXIT_FUNCTION_VOID(); return; }
bool ConfigurationRead(struct Configuration* configuration, const char* path) { HashTableClear(&configuration->root); HashTableClear(&configuration->sections); return ini_parse(path, _iniRead, configuration) == 0; }
bool ConfigurationReadVFile(struct Configuration* configuration, struct VFile* vf) { HashTableClear(&configuration->root); HashTableClear(&configuration->sections); return ini_parse_stream(_vfgets, vf, _iniRead, configuration) == 0; }