139 lines
3.4 KiB
C
139 lines
3.4 KiB
C
|
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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|