From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/setupapi/tests/parser.c | 63 ++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+)
diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c index 7c58acdc362..6658ff703bd 100644 --- a/dlls/setupapi/tests/parser.c +++ b/dlls/setupapi/tests/parser.c @@ -805,6 +805,68 @@ static void test_GLE(void) SetupCloseInfFile( hinf ); }
+static void test_SetupGetBinaryField(void) +{ + static const char inf[] = + "[Version]\n" + "Signature="$Windows NT$"\n" + "[section]\n" + "key1=0,11,022,0xaA,0x0Ff\n" + "key2=123\n"; + INFCONTEXT context; + BYTE buffer[6]; + DWORD size; + HINF hinf; + UINT err; + BOOL ret; + + hinf = test_file_contents(inf, strlen(inf), &err); + ok(hinf != NULL, "Expected valid INF file\n"); + + ret = SetupFindFirstLineA(hinf, "section", "key1", &context); + ok(ret == TRUE, "got error %lu\n", GetLastError()); + + memset(buffer, 0xcc, sizeof(buffer)); + size = 0xdeadbeef; + ret = SetupGetBinaryField(&context, 2, buffer, 0, &size); + ok(!ret, "got %d\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError()); + ok(size == 4, "got size %lu\n", size); + ok(buffer[0] == 0xcc, "got %#x\n", buffer[0]); + + memset(buffer, 0xcc, sizeof(buffer)); + size = 0xdeadbeef; + ret = SetupGetBinaryField(&context, 2, buffer, 3, &size); + ok(!ret, "got %d\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError()); + ok(size == 4, "got size %lu\n", size); + ok(buffer[0] == 0xcc, "got %#x\n", buffer[0]); + + memset(buffer, 0xcc, sizeof(buffer)); + size = 0xdeadbeef; + ret = SetupGetBinaryField(&context, 2, buffer, 4, &size); + ok(ret == TRUE, "got %d\n", ret); + todo_wine ok(!GetLastError(), "got error %lu\n", GetLastError()); + ok(size == 4, "got size %lu\n", size); + ok(buffer[0] == 0x11, "got %#x\n", buffer[0]); + ok(buffer[1] == 0x22, "got %#x\n", buffer[1]); + todo_wine ok(buffer[2] == 0xaa, "got %#x\n", buffer[2]); + todo_wine ok(buffer[3] == 0xff, "got %#x\n", buffer[3]); + + ret = SetupFindFirstLineA(hinf, "section", "key2", &context); + ok(ret == TRUE, "got error %lu\n", GetLastError()); + + memset(buffer, 0xcc, sizeof(buffer)); + size = 0xdeadbeef; + ret = SetupGetBinaryField(&context, 1, buffer, 0, &size); + ok(!ret, "got %d\n", ret); + todo_wine ok(GetLastError() == ERROR_INVALID_DATA, "got error %lu\n", GetLastError()); + todo_wine ok(size == 0xdeadbeef, "got size %lu\n", size); + ok(buffer[0] == 0xcc, "got %#x\n", buffer[0]); + + SetupCloseInfFile( hinf ); +} + START_TEST(parser) { init_function_pointers(); @@ -816,5 +878,6 @@ START_TEST(parser) test_pSetupGetField(); test_SetupGetIntField(); test_GLE(); + test_SetupGetBinaryField(); DeleteFileA( tmpfilename ); }
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/setupapi/parser.c | 11 +++++++++-- dlls/setupapi/tests/parser.c | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/dlls/setupapi/parser.c b/dlls/setupapi/parser.c index 1c09d39a0fe..a9c49ffe2e4 100644 --- a/dlls/setupapi/parser.c +++ b/dlls/setupapi/parser.c @@ -1825,10 +1825,17 @@ BOOL WINAPI SetupGetBinaryField( PINFCONTEXT context, DWORD index, BYTE *buffer, field = &file->fields[line->first_field + index]; for (i = index; i < line->nb_fields; i++, field++) { - const WCHAR *p; + const WCHAR *p = field->text; DWORD value = 0; int d; - for (p = field->text; *p && (d = xdigit_to_int(*p)) != -1; p++) + + if (*p == '0') + { + ++p; + if (*p == 'X' || *p == 'x') + ++p; + } + for (; *p && (d = xdigit_to_int(*p)) != -1; p++) { if ((value <<= 4) > 255) { diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c index 6658ff703bd..a2da215ec33 100644 --- a/dlls/setupapi/tests/parser.c +++ b/dlls/setupapi/tests/parser.c @@ -850,8 +850,8 @@ static void test_SetupGetBinaryField(void) ok(size == 4, "got size %lu\n", size); ok(buffer[0] == 0x11, "got %#x\n", buffer[0]); ok(buffer[1] == 0x22, "got %#x\n", buffer[1]); - todo_wine ok(buffer[2] == 0xaa, "got %#x\n", buffer[2]); - todo_wine ok(buffer[3] == 0xff, "got %#x\n", buffer[3]); + ok(buffer[2] == 0xaa, "got %#x\n", buffer[2]); + ok(buffer[3] == 0xff, "got %#x\n", buffer[3]);
ret = SetupFindFirstLineA(hinf, "section", "key2", &context); ok(ret == TRUE, "got error %lu\n", GetLastError());