0

I'm having a problem with ChangeServiceConfig2(...SERVICE_CONFIG_TRIGGER_INFO...)

Relevant code:

    WCHAR test[] = L"TEST12";
    SERVICE_TRIGGER_SPECIFIC_DATA_ITEM stdata {
        SERVICE_TRIGGER_DATA_TYPE_STRING,
        wcslen(test)*sizeof(WCHAR),
        reinterpret_cast<BYTE*>(test)
    };
    SERVICE_TRIGGER st {
        SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT,
        SERVICE_TRIGGER_ACTION_SERVICE_START,
        const_cast<GUID*>(&NAMED_PIPE_EVENT_GUID),
        1, &stdata
    };
    ChangeServiceConfig2(Service, SERVICE_CONFIG_TRIGGER_INFO, &st);

This causes an Access Violation on address 00000009, so clearly an unchecked null pointer. And it's not a null pointer in st or stdata. The address 00000009 does not depend on the length of test[].

Stack dump:

rpcrt4.dll!NdrpEmbeddedRepeatPointerBufferSize()
rpcrt4.dll!NdrConformantArrayBufferSize()
rpcrt4.dll!NdrSimpleStructBufferSize()
rpcrt4.dll!NdrpUnionBufferSize()
rpcrt4.dll!_NdrNonEncapsulatedUnionBufferSize@12()
rpcrt4.dll!NdrComplexStructBufferSize()
rpcrt4.dll!NdrClientCall2() rpcrt4.dll!_NdrClientCall4()
sechost.dll!ChangeServiceConfig2W()

The Service member is not the problem, or ChangeServiceConfig2 itself: I can set the service description via ChangeServiceConfig2(Service, SERVICE_CONFIG_DESCRIPTION, &desc);. The problem appears to be in the parsing of SERVICE_TRIGGER. Named Pipe service triggers apparently work for the Remote Registry service, so it's not fundamentally broken.

Q: which part of my SERVICE_TRIGGER is wrong?

Obviously there is at least one bug in Windows; at the very least it fails in parameter validation.

MSalters
  • 173,980
  • 10
  • 155
  • 350

1 Answers1

2

The SERVICE_TRIGGER object is correct, but ChangeServiceConfig2 wants a SERVICE_TRIGGER_INFO. Simple solution: wrap st using SERVICE_TRIGGER_INFO sti{ 1, &st, NULL };

MSalters
  • 173,980
  • 10
  • 155
  • 350