|
|
BOOL pSetupGetKey ( IN PINFCONTEXT pic, OUT PTSTR KeyBuf, OUT PBOOL KeyExistsOnLine )
/*++
Routine Description:
pSetupGetKey copies the key for the specified INF context. If a key does not exist, then KeyBuf is reset.
Arguments:
pic - Specifies the INFCONTEXT that indicates which line to query
KeyBuf - Receives the key, or is emptied of there is no key
KeyExistsOnLine - Receives TRUE if the line has a key, or FALSE if not.
Return Value:
TRUE if successful, FALSE if not.
--*/
{ UINT KeySize; PTSTR TempKeyBuf; PTSTR TempLineBuf; UINT LineSize;
//
// Get the key (if it exists)
//
*KeyExistsOnLine = FALSE; if (!SetupGetStringField (pic, 0, NULL, 0, &KeySize)) { //
// Key does not exist
//
KeyBuf[0] = 0; return TRUE; }
//
// Use the caller's buffer if it is big enough
//
KeySize *= sizeof (TCHAR); if (KeySize >= MAX_KEY * sizeof (TCHAR)) { TempKeyBuf = (PTSTR) MemAlloc (g_hHeap, 0, KeySize); if (!TempKeyBuf) { LOG ((LOG_ERROR, "Setup Get Key: Could not allocate temp buffer")); return FALSE; } } else { TempKeyBuf = KeyBuf; }
__try { if (!SetupGetStringField (pic, 0, TempKeyBuf, KeySize, NULL)) { DEBUGMSG ((DBG_WHOOPS, "pSetupGetKey: Could not read specified INF line")); return FALSE; }
//
// Get the line and compare against the key
//
if (SetupGetLineText (pic, NULL, NULL, NULL, NULL, 0, &LineSize)) { //
// If the sizes are the same, we must actually get the text, then
// compare the key against the line
//
LineSize *= sizeof (TCHAR);
if (LineSize == KeySize) { TempLineBuf = (PTSTR) MemAlloc (g_hHeap, 0, LineSize); if (!TempLineBuf) { LOG ((LOG_ERROR, "Setup Get Key: Could not allocate line buffer")); return FALSE; }
__try { if (!SetupGetLineText (pic, NULL, NULL, NULL, TempLineBuf, LineSize, NULL)) { DEBUGMSG ((DBG_WHOOPS, "pSetupGetKey: Could not get line text")); return FALSE; }
if (!StringCompare (TempLineBuf, TempKeyBuf)) { //
// There is no key for this line
//
TempKeyBuf[0] = 0; } else { //
// There is a key for this line
//
*KeyExistsOnLine = TRUE; } } __finally { MemFree (g_hHeap, 0, TempLineBuf); } } else { //
// Since the sizes are different, we know there is a key
//
*KeyExistsOnLine = TRUE; } }
//
// If we were not using the caller's buffer, copy as much of the
// key as will fit
//
if (TempKeyBuf != KeyBuf) { _tcssafecpy (KeyBuf, TempKeyBuf, MAX_KEY); } } __finally { if (TempKeyBuf != KeyBuf) { MemFree (g_hHeap, 0, TempKeyBuf); } }
return TRUE; }
|