1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Setup Library 4 * FILE: base/setup/lib/infsupp.c 5 * PURPOSE: Interfacing with Setup* API .INF Files support functions 6 * PROGRAMMERS: Hervé Poussineau 7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr) 8 */ 9 10 /* INCLUDES *****************************************************************/ 11 12 #include "precomp.h" 13 #include "infsupp.h" 14 15 #define NDEBUG 16 #include <debug.h> 17 18 /* GLOBALS *******************************************************************/ 19 20 /* 21 * These externs should be defined by the user of this library. 22 * They are kept there for reference and ease of usage. 23 */ 24 #if 0 25 26 pSpInfCloseInfFile SpInfCloseInfFile = NULL; 27 pSpInfFindFirstLine SpInfFindFirstLine = NULL; 28 pSpInfFindNextLine SpInfFindNextLine = NULL; 29 pSpInfGetFieldCount SpInfGetFieldCount = NULL; 30 pSpInfGetBinaryField SpInfGetBinaryField = NULL; 31 pSpInfGetIntField SpInfGetIntField = NULL; 32 pSpInfGetMultiSzField SpInfGetMultiSzField = NULL; 33 pSpInfGetStringField SpInfGetStringField = NULL; 34 pSpInfGetField SpInfGetField = NULL; 35 pSpInfOpenInfFile SpInfOpenInfFile = NULL; 36 37 #endif 38 39 /* HELPER FUNCTIONS **********************************************************/ 40 41 BOOLEAN 42 INF_GetDataField( 43 IN PINFCONTEXT Context, 44 IN ULONG FieldIndex, 45 OUT PCWSTR* Data) 46 { 47 #if 0 48 49 BOOL Success; 50 PWCHAR InfData; 51 DWORD dwSize; 52 53 *Data = NULL; 54 55 Success = SpInfGetStringField(Context, 56 FieldIndex, 57 NULL, 58 0, 59 &dwSize); 60 if (!Success) 61 return FALSE; 62 63 InfData = RtlAllocateHeap(ProcessHeap, 0, dwSize * sizeof(WCHAR)); 64 if (!InfData) 65 return FALSE; 66 67 Success = SpInfGetStringField(Context, 68 FieldIndex, 69 InfData, 70 dwSize, 71 NULL); 72 if (!Success) 73 { 74 RtlFreeHeap(ProcessHeap, 0, InfData); 75 return FALSE; 76 } 77 78 *Data = InfData; 79 return TRUE; 80 81 #else 82 83 *Data = SpInfGetField(Context, FieldIndex); 84 return !!*Data; 85 86 #endif 87 } 88 89 BOOLEAN 90 INF_GetData( 91 IN PINFCONTEXT Context, 92 OUT PCWSTR* Key, 93 OUT PCWSTR* Data) 94 { 95 BOOL Success; 96 PCWSTR InfData[2] = {NULL, NULL}; 97 98 if (Key) 99 *Key = NULL; 100 101 if (Data) 102 *Data = NULL; 103 104 /* 105 * Verify that the INF file has only one value field, in addition to its key name. 106 * Note that SpInfGetFieldCount() does not count the key name as a field. 107 */ 108 if (SpInfGetFieldCount(Context) != 1) 109 { 110 DPRINT1("SpInfGetFieldCount != 1\n"); 111 return FALSE; 112 } 113 114 if (Key) 115 { 116 Success = INF_GetDataField(Context, 0, &InfData[0]); 117 if (!Success) 118 return FALSE; 119 } 120 121 if (Data) 122 { 123 Success = INF_GetDataField(Context, 1, &InfData[1]); 124 if (!Success) 125 { 126 INF_FreeData(InfData[0]); 127 return FALSE; 128 } 129 } 130 131 if (Key) 132 *Key = InfData[0]; 133 134 if (Data) 135 *Data = InfData[1]; 136 137 return TRUE; 138 } 139 140 /* EOF */ 141