VOID DiskDrivesLoadList( VOID ) { PPH_STRING settingsString; PH_STRINGREF remaining; settingsString = PhaGetStringSetting(SETTING_NAME_DISK_LIST); remaining = settingsString->sr; while (remaining.Length != 0) { PH_STRINGREF part; DV_DISK_ID id; PDV_DISK_ENTRY entry; if (remaining.Length == 0) break; PhSplitStringRefAtChar(&remaining, ',', &part, &remaining); InitializeDiskId(&id, PhCreateString2(&part)); entry = CreateDiskEntry(&id); DeleteDiskId(&id); entry->UserReference = TRUE; } }
VOID AddDiskDriveToListView( _In_ PDV_DISK_OPTIONS_CONTEXT Context, _In_ BOOLEAN DiskPresent, _In_ PPH_STRING DiskPath, _In_ PPH_STRING DiskName ) { DV_DISK_ID adapterId; INT lvItemIndex; BOOLEAN found = FALSE; PDV_DISK_ID newId = NULL; InitializeDiskId(&adapterId, DiskPath); for (ULONG i = 0; i < DiskDrivesList->Count; i++) { PDV_DISK_ENTRY entry = PhReferenceObjectSafe(DiskDrivesList->Items[i]); if (!entry) continue; if (EquivalentDiskId(&entry->Id, &adapterId)) { newId = PhAllocate(sizeof(DV_DISK_ID)); CopyDiskId(newId, &entry->Id); if (entry->UserReference) found = TRUE; } PhDereferenceObjectDeferDelete(entry); if (newId) break; } if (!newId) { newId = PhAllocate(sizeof(DV_DISK_ID)); CopyDiskId(newId, &adapterId); PhMoveReference(&newId->DevicePath, DiskPath); } lvItemIndex = AddListViewItemGroupId( Context->ListViewHandle, DiskPresent ? 0 : 1, MAXINT, DiskName->Buffer, newId ); if (found) ListView_SetItemState(Context->ListViewHandle, lvItemIndex, ITEM_CHECKED, LVIS_STATEIMAGEMASK); DeleteDiskId(&adapterId); }
static VOID DiskEntryDeleteProcedure( _In_ PVOID Object, _In_ ULONG Flags ) { PDV_DISK_ENTRY entry = Object; PhAcquireQueuedLockExclusive(&DiskDrivesListLock); PhRemoveItemList(DiskDrivesList, PhFindItemList(DiskDrivesList, entry)); PhReleaseQueuedLockExclusive(&DiskDrivesListLock); DeleteDiskId(&entry->Id); PhClearReference(&entry->DiskName); PhDeleteCircularBuffer_ULONG64(&entry->ReadBuffer); PhDeleteCircularBuffer_ULONG64(&entry->WriteBuffer); }
VOID FreeListViewDiskDriveEntries( _In_ PDV_DISK_OPTIONS_CONTEXT Context ) { ULONG index = -1; while ((index = PhFindListViewItemByFlags( Context->ListViewHandle, index, LVNI_ALL )) != -1) { PDV_DISK_ID param; if (PhGetListViewItemParam(Context->ListViewHandle, index, ¶m)) { DeleteDiskId(param); PhFree(param); } } }