In general, procedures with many arguments are awkward. Bob Martin's book, Clean Code, explains why. But there are always exceptions.
Reading through your arguments, it seems like they could be grouped into categories, and you could create a struct per category. In my projects, I often have State, Settings and Config structs for each resource (thread, object, actor, etc.). State is private to the resource and usually initialized to some all-zero or value representing "unknown". Settings are private to the resource, have setter procedures and are initialized to default values often by reading from a non-volatile storage. Settings change throughout runtime. Config is initialized at the start and doesn't change without resetting the subsystem/thread/process. Sometimes Config is fixed at compile-time.