| /* |
| * SetupX .inf file parsing functions |
| * |
| * FIXME: |
| * - return values ??? |
| * - this should be reimplemented at some point to have its own |
| * file parsing instead of using profile functions, |
| * as some SETUPX exports probably demand that |
| * (IpSaveRestorePosition, IpFindNextMatchLine, ...). |
| */ |
| |
| #include <string.h> |
| #include "debugtools.h" |
| #include "windef.h" |
| #include "winbase.h" |
| #include "heap.h" |
| #include "wine/winbase16.h" |
| #include "setupx16.h" |
| #include "setupapi_private.h" |
| |
| DEFAULT_DEBUG_CHANNEL(setupapi); |
| |
| WORD InfNumEntries = 0; |
| INF_FILE *InfList = NULL; |
| HINF16 IP_curr_handle = 0; |
| |
| RETERR16 IP_OpenInf(LPCSTR lpInfFileName, HINF16 *lphInf) |
| { |
| HFILE hFile = _lopen(lpInfFileName, OF_READ); |
| |
| if (!lphInf) |
| return IP_ERROR; |
| |
| /* this could be improved by checking for already freed handles */ |
| if (IP_curr_handle == 0xffff) |
| return ERR_IP_OUT_OF_HANDLES; |
| |
| if (hFile != HFILE_ERROR) |
| { |
| InfList = HeapReAlloc(GetProcessHeap(), 0, InfList, InfNumEntries+1); |
| InfList[InfNumEntries].hInf = IP_curr_handle++; |
| InfList[InfNumEntries].hInfFile = hFile; |
| InfList[InfNumEntries].lpInfFileName = HeapAlloc( GetProcessHeap(), 0, |
| strlen(lpInfFileName)+1); |
| strcpy( InfList[InfNumEntries].lpInfFileName, lpInfFileName ); |
| *lphInf = InfList[InfNumEntries].hInf; |
| InfNumEntries++; |
| TRACE("ret handle %d.\n", *lphInf); |
| return OK; |
| } |
| *lphInf = 0xffff; |
| return ERR_IP_INVALID_INFFILE; |
| } |
| |
| BOOL IP_FindInf(HINF16 hInf, WORD *ret) |
| { |
| WORD n; |
| |
| for (n=0; n < InfNumEntries; n++) |
| if (InfList[n].hInf == hInf) |
| { |
| *ret = n; |
| return TRUE; |
| } |
| return FALSE; |
| } |
| |
| |
| LPCSTR IP_GetFileName(HINF16 hInf) |
| { |
| WORD n; |
| if (IP_FindInf(hInf, &n)) |
| { |
| return InfList[n].lpInfFileName; |
| } |
| return NULL; |
| } |
| |
| RETERR16 IP_CloseInf(HINF16 hInf) |
| { |
| int i; |
| WORD n; |
| RETERR16 res = ERR_IP_INVALID_HINF; |
| |
| if (IP_FindInf(hInf, &n)) |
| { |
| _lclose(InfList[n].hInfFile); |
| HeapFree(GetProcessHeap(), 0, InfList[n].lpInfFileName); |
| for (i=n; i < InfNumEntries-1; i++) |
| InfList[i] = InfList[i+1]; |
| InfNumEntries--; |
| InfList = HeapReAlloc(GetProcessHeap(), 0, InfList, InfNumEntries); |
| res = OK; |
| } |
| return res; |
| } |
| |
| /*********************************************************************** |
| * IpOpen16 |
| * |
| */ |
| RETERR16 WINAPI IpOpen16(LPCSTR lpInfFileName, HINF16 *lphInf) |
| { |
| TRACE("('%s', %p)\n", lpInfFileName, lphInf); |
| return IP_OpenInf(lpInfFileName, lphInf); |
| } |
| |
| /*********************************************************************** |
| * IpClose16 |
| */ |
| RETERR16 WINAPI IpClose16(HINF16 hInf) |
| { |
| return IP_CloseInf(hInf); |
| } |
| |
| /*********************************************************************** |
| * IpGetProfileString16 |
| */ |
| RETERR16 WINAPI IpGetProfileString16(HINF16 hInf, LPCSTR section, LPCSTR entry, LPSTR buffer, WORD buflen) |
| { |
| TRACE("'%s': section '%s' entry '%s'\n", IP_GetFileName(hInf), section, entry); |
| GetPrivateProfileStringA(section, entry, "", buffer, buflen, IP_GetFileName(hInf)); |
| return 0; |
| } |