1
1
Fork 0
mirror of https://github.com/pbatard/rufus.git synced 2024-08-14 23:57:05 +00:00

[core] added string array manipulation

* for drive description report
* also added MSVC memory leak detection in debug mode
This commit is contained in:
Pete Batard 2011-11-21 20:12:23 +00:00
parent f355c450b6
commit f263369e55
5 changed files with 96 additions and 10 deletions

View file

@ -73,7 +73,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<BuildLog /> <BuildLog />
<ClCompile> <ClCompile>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;ISOLATION_AWARE_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRTDBG_MAP_ALLOC;_CRT_SECURE_NO_WARNINGS;ISOLATION_AWARE_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
</ClCompile> </ClCompile>
@ -92,7 +92,7 @@
</Midl> </Midl>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>..\..\msvc;..\..\libwdi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\..\msvc;..\..\libwdi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;ISOLATION_AWARE_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRTDBG_MAP_ALLOC;_CRT_SECURE_NO_WARNINGS;ISOLATION_AWARE_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>

33
rufus.c
View file

@ -19,6 +19,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* Memory leaks detection - define _CRTDBG_MAP_ALLOC as preprocessor macro */
#ifdef _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif
#include <windows.h> #include <windows.h>
#include <windowsx.h> #include <windowsx.h>
#include <stdlib.h> #include <stdlib.h>
@ -42,8 +48,6 @@
const GUID GUID_DEVINTERFACE_DISK = { 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} }; const GUID GUID_DEVINTERFACE_DISK = { 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} };
#endif #endif
extern char *WindowsErrorString(void);
/* /*
* Globals * Globals
*/ */
@ -54,7 +58,7 @@ HWND hStatus;
float fScale = 1.0f; float fScale = 1.0f;
static HWND hDeviceList, hCapacity, hFileSystem; static HWND hDeviceList, hCapacity, hFileSystem;
static StrArray DriveID;
#ifdef RUFUS_DEBUG #ifdef RUFUS_DEBUG
void _uprintf(const char *format, ...) void _uprintf(const char *format, ...)
@ -366,6 +370,7 @@ static BOOL GetUSBDevices(void)
const char* usbstor_name = "USBSTOR"; const char* usbstor_name = "USBSTOR";
IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList)); IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList));
StrArrayClear(&DriveID);
dev_info = SetupDiGetClassDevsA(&GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); dev_info = SetupDiGetClassDevsA(&GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
if (dev_info == INVALID_HANDLE_VALUE) { if (dev_info == INVALID_HANDLE_VALUE) {
@ -391,6 +396,7 @@ static BOOL GetUSBDevices(void)
continue; continue;
} }
uprintf("found drive '%s'\n", buffer); uprintf("found drive '%s'\n", buffer);
StrArrayAdd(&DriveID, buffer);
devint_data.cbSize = sizeof(devint_data); devint_data.cbSize = sizeof(devint_data);
hDrive = INVALID_HANDLE_VALUE; hDrive = INVALID_HANDLE_VALUE;
@ -459,6 +465,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
{ {
HDC hDC; HDC hDC;
DRAWITEMSTRUCT* pDI; DRAWITEMSTRUCT* pDI;
int nDeviceIndex;
switch (message) { switch (message) {
@ -479,6 +486,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
CreateStatusBar(); CreateStatusBar();
// Display the version in the right area of the status bar // Display the version in the right area of the status bar
SendMessageA(GetDlgItem(hDlg, IDC_STATUS), SB_SETTEXTA, SBT_OWNERDRAW | 1, (LPARAM)APP_VERSION); SendMessageA(GetDlgItem(hDlg, IDC_STATUS), SB_SETTEXTA, SBT_OWNERDRAW | 1, (LPARAM)APP_VERSION);
StrArrayCreate(&DriveID, 16);
GetUSBDevices(); GetUSBDevices();
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
@ -497,19 +505,26 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
case WM_COMMAND: case WM_COMMAND:
switch(LOWORD(wParam)) { switch(LOWORD(wParam)) {
case IDOK: // close application
case IDCANCEL:
PostQuitMessage(0);
StrArrayDestroy(&DriveID);
EndDialog(hDlg, 0);
break;
case IDC_ABOUT: case IDC_ABOUT:
CreateAboutBox(); CreateAboutBox();
break; break;
case IDC_DEVICE: // dropdown: device description case IDC_DEVICE: // dropdown: device description
switch (HIWORD(wParam)) { switch (HIWORD(wParam)) {
case CBN_SELCHANGE: case CBN_SELCHANGE:
PopulateProperties(ComboBox_GetCurSel(hDeviceList)); nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
if (nDeviceIndex != CB_ERR) {
PopulateProperties(ComboBox_GetCurSel(hDeviceList));
SetDlgItemTextU(hMainDialog, IDC_STATUS, DriveID.Table[nDeviceIndex]);
}
break; break;
} }
break; break;
case IDC_CLOSE:
PostQuitMessage(0);
break;
default: default:
return (INT_PTR)FALSE; return (INT_PTR)FALSE;
} }
@ -570,5 +585,9 @@ out:
CloseHandle(mutex); CloseHandle(mutex);
uprintf("*** RUFUS EXIT ***\n"); uprintf("*** RUFUS EXIT ***\n");
#ifdef _CRTDBG_MAP_ALLOC
_CrtDumpMemoryLeaks();
#endif
return 0; return 0;
} }

13
rufus.h
View file

@ -64,10 +64,23 @@ extern char szFolderPath[MAX_PATH];
/* /*
* Shared prototypes * Shared prototypes
*/ */
extern char *WindowsErrorString(void);
extern void CenterDialog(HWND hDlg); extern void CenterDialog(HWND hDlg);
extern void CreateStatusBar(void); extern void CreateStatusBar(void);
extern INT_PTR CreateAboutBox(void); extern INT_PTR CreateAboutBox(void);
/* Basic String Array */
typedef struct {
char** Table;
size_t Size;
size_t Index;
size_t Max;
} StrArray;
extern void StrArrayCreate(StrArray* arr, size_t initial_size);
extern void StrArrayAdd(StrArray* arr, const char* str);
extern void StrArrayClear(StrArray* arr);
extern void StrArrayDestroy(StrArray* arr);
#ifdef RUFUS_DEBUG #ifdef RUFUS_DEBUG
extern void _uprintf(const char *format, ...); extern void _uprintf(const char *format, ...);
#define uprintf(...) _uprintf(__VA_ARGS__) #define uprintf(...) _uprintf(__VA_ARGS__)

View file

@ -34,7 +34,7 @@ CAPTION "Rufus"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,102,223,50,14 DEFPUSHBUTTON "Start",IDC_START,102,223,50,14
PUSHBUTTON "Close",IDC_CLOSE,156,223,50,14 PUSHBUTTON "Close",IDCANCEL,156,223,50,14
COMBOBOX IDC_DEVICE,16,20,190,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_DEVICE,16,20,190,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Device",IDC_STATIC,17,8,22,8 LTEXT "Device",IDC_STATIC,17,8,22,8
COMBOBOX IDC_FILESYSTEM,16,80,190,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_FILESYSTEM,16,80,190,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP

54
stdlg.c
View file

@ -19,6 +19,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* Memory leaks detection - define _CRTDBG_MAP_ALLOC as preprocessor macro */
#ifdef _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif
#include <windows.h> #include <windows.h>
#include <windowsx.h> #include <windowsx.h>
#include <stdlib.h> #include <stdlib.h>
@ -127,6 +133,54 @@ void DetectWindowsVersion(void)
} }
} }
/*
* String array manipulation
*/
void StrArrayCreate(StrArray* arr, size_t initial_size)
{
if (arr == NULL) return;
arr->Max = initial_size; arr->Index = 0;
arr->Table = (char**)calloc(arr->Max, sizeof(char*));
if (arr->Table == NULL)
uprintf("Could not allocate string array\n");
}
void StrArrayAdd(StrArray* arr, const char* str)
{
if ((arr == NULL) || (arr->Table == NULL))
return;
if (arr->Index == arr->Max) {
arr->Max *= 2;
arr->Table = (char**)realloc(arr->Table, arr->Max*sizeof(char*));
if (arr->Table == NULL) {
uprintf("Could not reallocate string array\n");
return;
}
}
arr->Table[arr->Index] = safe_strdup(str);
if (arr->Table[arr->Index++] == NULL) {
uprintf("Could not store string in array\n");
}
}
void StrArrayClear(StrArray* arr)
{
size_t i;
if ((arr == NULL) || (arr->Table == NULL))
return;
for (i=0; i<arr->Index; i++) {
safe_free(arr->Table[i]);
}
arr->Index = 0;
}
void StrArrayDestroy(StrArray* arr)
{
StrArrayClear(arr);
safe_free(arr->Table);
}
/* /*
* We need a sub-callback to read the content of the edit box on exit and update * We need a sub-callback to read the content of the edit box on exit and update
* our path, else if what the user typed does match the selection, it is discarded. * our path, else if what the user typed does match the selection, it is discarded.