Undocumented functionsyssetup.dll.SetupQueryRegisteredOsComponent

Dmitry Timoshkov dmitry at codeweavers.com
Sat Mar 24 09:51:33 CDT 2007


"Rolf Kalbermatter" <r.kalbermatter at hccnet.nl> wrote:

>>From a quick check it seems to take three parameters, with the first being
> a CLSID or other GUID and the other two being DWORDs. The second parameter
> is checked to be higher than 0 and smaller or equal to 0xDC and the third
> parameter is checked to be higher than 0 and smaller or equal to 0x454.
> (This is XP SP2 fully patched).
> When any of the three parameters are 0, the function sets last error to 0x57
> and returns with 0. When the second and third parameter is above the limits
> the function sets last error to 0x0D and returns with 0. When everything was
> successful the function returns with 1.

This appears to be a correct description, at least attached test shows exactly
the same behaviour as described above. If I add 2 more parameters as Andrey
suggested I get a crash due to stack corruption.

This information should be enough to create a stub.

-- 
Dmitry.
-------------- next part --------------
#include <windows.h>
#include <objbase.h>
#include <stdio.h>
#include <assert.h>

typedef struct
{
    DWORD dwSize;
    char unused[0xd8];
} UNK_1;

typedef struct
{
    DWORD dwSize;
    char unused[0x450];
} UNK_2;

int main(void)
{
    BOOL (WINAPI *pSetupQueryRegisteredOsComponent)(const IID *const iid, LPVOID component_data, LPVOID exception_data);
    BOOL ret;
    IID guid;
    HRESULT hres;
    HANDLE hDll;
    UNK_1 unk_1;
    UNK_2 unk_2;

    hres = IIDFromString(L"{473FF9A0-D659-11D1-A4B2-006008AF820E}", &guid);
    assert(hres == S_OK);

    hDll = LoadLibrary("syssetup.dll");
    assert(hDll);
    pSetupQueryRegisteredOsComponent = (void *)GetProcAddress(hDll, "SetupQueryRegisteredOsComponent");
    assert(pSetupQueryRegisteredOsComponent);

    SetLastError(0xdeadbeef);
    ret = pSetupQueryRegisteredOsComponent(NULL, NULL, NULL);
    printf("(NULL, NULL, NULL) ret = %d, error %u\n", ret, GetLastError());
    assert(GetLastError() == ERROR_INVALID_PARAMETER);

    unk_1.dwSize = sizeof(unk_1);
    unk_2.dwSize = sizeof(unk_2);
    SetLastError(0xdeadbeef);
    ret = pSetupQueryRegisteredOsComponent(&guid, &unk_1, &unk_2);
    printf("(&guid, &unk_1, &unk_2) ret = %d, error %u\n", ret, GetLastError());
    assert(GetLastError() == ERROR_FILE_NOT_FOUND);

    unk_1.dwSize = sizeof(unk_1) + 1;
    unk_2.dwSize = sizeof(unk_2) + 1;
    SetLastError(0xdeadbeef);
    ret = pSetupQueryRegisteredOsComponent(&guid, &unk_1, &unk_2);
    printf("(&guid, &unk_1, &unk_2) ret = %d, error %u\n", ret, GetLastError());
    assert(GetLastError() == ERROR_INVALID_DATA);

    FreeLibrary(hDll);
    return 0;
}


More information about the wine-devel mailing list