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:
		
							parent
							
								
									f355c450b6
								
							
						
					
					
						commit
						f263369e55
					
				
					 5 changed files with 96 additions and 10 deletions
				
			
		|  | @ -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
									
										
									
									
									
								
							
							
						
						
									
										33
									
								
								rufus.c
									
										
									
									
									
								
							|  | @ -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
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								rufus.h
									
										
									
									
									
								
							|  | @ -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__) | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								rufus.rc
									
										
									
									
									
								
							|  | @ -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
									
										
									
									
									
								
							
							
						
						
									
										54
									
								
								stdlg.c
									
										
									
									
									
								
							|  | @ -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. | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue