aboutsummaryrefslogtreecommitdiffstats
path: root/capture_win_ifnames.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2012-11-23 08:10:49 +0000
committerGuy Harris <guy@alum.mit.edu>2012-11-23 08:10:49 +0000
commit39fe3c0cee44b521c4a608fa36ead74f4477bb08 (patch)
tree5f7a18dce07b8563dbb0a35f288213302b4995ce /capture_win_ifnames.c
parentd2e7cfceeef25e739df42f81771343e97b4a96d7 (diff)
Parse the GUID ourselves; that leaves fewer error cases to worry about,
and thus fewer places where we would need to report an error rather than just saying "well, this name doesn't end in a GUID, so it doesn't correspond to an interface whose friendly name we can ask for". svn path=/trunk/; revision=46149
Diffstat (limited to 'capture_win_ifnames.c')
-rw-r--r--capture_win_ifnames.c166
1 files changed, 133 insertions, 33 deletions
diff --git a/capture_win_ifnames.c b/capture_win_ifnames.c
index eaa5e0541d..c68ebe736e 100644
--- a/capture_win_ifnames.c
+++ b/capture_win_ifnames.c
@@ -238,6 +238,54 @@ static int GetInterfaceFriendlyNameFromDeviceGuid(__in GUID *guid, __out char **
return 0;
}
+static int gethexdigit(const char *p)
+{
+ if(*p >= '0' && *p <= '9'){
+ return *p - '0';
+ }else if(*p >= 'A' && *p <= 'F'){
+ return *p - 'A' + 0xA;
+ }else if(*p >= 'a' && *p <= 'f'){
+ return *p - 'a' + 0xa;
+ }else{
+ return -1; /* Not a hex digit */
+ }
+}
+
+static gboolean get8hexdigits(const char *p, DWORD *d)
+{
+ int digit;
+ DWORD val;
+ int i;
+
+ val = 0;
+ for(i = 0; i < 8; i++){
+ digit = gethexdigit(p++);
+ if(digit == -1){
+ return FALSE; /* Not a hex digit */
+ }
+ val = (val << 4) | digit;
+ }
+ *d = val;
+ return TRUE;
+}
+
+static gboolean get4hexdigits(const char *p, WORD *w)
+{
+ int digit;
+ WORD val;
+ int i;
+
+ val = 0;
+ for(i = 0; i < 4; i++){
+ digit = gethexdigit(p++);
+ if(digit == -1){
+ return FALSE; /* Not a hex digit */
+ }
+ val = (val << 4) | digit;
+ }
+ *w = val;
+ return TRUE;
+}
/**********************************************************************************/
/* returns the interface friendly name for a device name, if it is unable to
@@ -246,6 +294,8 @@ void get_windows_interface_friendlyname(/* IN */ char *interface_devicename, /*
{
const char* guid_text;
GUID guid;
+ int i;
+ int digit1, digit2;
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "test, 1,2,3");
@@ -265,41 +315,91 @@ void get_windows_interface_friendlyname(/* IN */ char *interface_devicename, /*
guid_text=interface_devicename;
}
- /*** Convert the GUID text to a GUID structure */
- {
- /* Part 1: (presumed) ASCII guid_text to UTF-16 */
- WCHAR wGuidText[39];
- HRESULT hr;
- int size=39; /* a guid should always been 38 unicode characters in length (+1 for null termination) */
- size=MultiByteToWideChar(CP_ACP, 0, guid_text, -1, wGuidText, size);
- if(size!=39){
- /*
- * GUID text to UTF-16 conversion failed.
- * XXX - is this assuming the GUID text is in the local
- * code page? If so, the error might just indicate that
- * it's not in the local code page; should we assume it's
- * UTF-8? If so, what if it's not *valid* UTF-8? Should
- * we just silently return "no friendly name" if this
- * fails?
- */
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_ERROR,
- "Failed the extract guid from interface devicename, unicode convert result=%d, guid input ='%s', LastErrorCode=0x%08x.",
- size, guid_text, GetLastError());
- return;
+ /*
+ * If what follows is a GUID in {}, then convert it to a GUID structure
+ * and use that to look up the interface to get its friendly name.
+ */
+ if(*guid_text != '{'){
+ return; /* Nope, not enclosed in {} */
+ }
+ guid_text++;
+ /* There must be 8 hex digits; if so, they go into guid.Data1 */
+ if(!get8hexdigits(guid_text, &guid.Data1)){
+ return; /* nope, not 8 hex digits */
+ }
+ guid_text += 8;
+ /* Now there must be a hyphen */
+ if(*guid_text != '-'){
+ return; /* Nope */
+ }
+ guid_text++;
+ /* There must be 4 hex digits; if so, they go into guid.Data2 */
+ if(!get4hexdigits(guid_text, &guid.Data2)){
+ return; /* nope, not 4 hex digits */
+ }
+ guid_text += 4;
+ /* Now there must be a hyphen */
+ if(*guid_text != '-'){
+ return; /* Nope */
+ }
+ guid_text++;
+ /* There must be 4 hex digits; if so, they go into guid.Data3 */
+ if(!get4hexdigits(guid_text, &guid.Data3)){
+ return; /* nope, not 4 hex digits */
+ }
+ guid_text += 4;
+ /* Now there must be a hyphen */
+ if(*guid_text != '-'){
+ return; /* Nope */
+ }
+ guid_text++;
+ /*
+ * There must be 4 hex digits; if so, they go into the first 2 bytes
+ * of guid.Data4.
+ */
+ for(i = 0; i < 2; i++){
+ digit1 = gethexdigit(guid_text);
+ if(digit1 == -1){
+ return; /* Not a hex digit */
}
- /* Part 2: UTF-16 GUID text to GUID structure */
- hr = CLSIDFromString(wGuidText, (LPCLSID)&guid);
- if (hr != S_OK){
- /*
- * GUID text to CLSID conversion failed; this probably
- * means that there isn't a GUID in the name, in which
- * case we can't get a friendly name for that name.
- *
- * Don't complain - this isn't an error; not all
- * interface names correspond to interfaces with GUIDs.
- */
- return;
+ guid_text++;
+ digit2 = gethexdigit(guid_text);
+ if(digit2 == -1){
+ return; /* Not a hex digit */
+ }
+ guid_text++;
+ guid.Data4[i] = (digit1 << 4)|(digit2);
+ }
+ /* Now there must be a hyphen */
+ if(*guid_text != '-'){
+ return; /* Nope */
+ }
+ guid_text++;
+ /*
+ * There must be 12 hex digits; if so,t hey go into the next 6 bytes
+ * of guid.Data4.
+ */
+ for(i = 0; i < 6; i++){
+ digit1 = gethexdigit(guid_text);
+ if(digit1 == -1){
+ return; /* Not a hex digit */
}
+ guid_text++;
+ digit2 = gethexdigit(guid_text);
+ if(digit2 == -1){
+ return; /* Not a hex digit */
+ }
+ guid_text++;
+ guid.Data4[i+2] = (digit1 << 4)|(digit2);
+ }
+ /* Now there must be a closing } */
+ if(*guid_text != '}'){
+ return; /* Nope */
+ }
+ guid_text++;
+ /* And that must be the end of the string */
+ if(*guid_text != '\0'){
+ return; /* Nope */
}
/* guid okay, get the interface friendly name associated with the guid */