static void print_arg(buf_info_t *buf, drsys_arg_t *arg) { if (arg->ordinal == -1) OUTPUT(buf, "\tretval: "); else OUTPUT(buf, "\targ %d: ", arg->ordinal); if (arg->enum_name != NULL) { if (drstrace_get_arg_symname(buf, arg)) return; } /* XXX: add return value to dr_fprintf so we can more easily align * after PFX vs PIFX w/o having to print to buffer */ switch (arg->type) { case DRSYS_TYPE_VOID: print_simple_value(buf, arg, true); break; case DRSYS_TYPE_POINTER: print_simple_value(buf, arg, true); break; case DRSYS_TYPE_BOOL: print_simple_value(buf, arg, false); break; case DRSYS_TYPE_INT: print_simple_value(buf, arg, false); break; case DRSYS_TYPE_SIGNED_INT: print_simple_value(buf, arg, false); break; case DRSYS_TYPE_UNSIGNED_INT: print_simple_value(buf, arg, false); break; case DRSYS_TYPE_HANDLE: print_simple_value(buf, arg, false); break; case DRSYS_TYPE_NTSTATUS: print_simple_value(buf, arg, false); break; case DRSYS_TYPE_ATOM: print_simple_value(buf, arg, false); break; default: { if (arg->value == 0) { OUTPUT(buf, "<null>"); } else if (arg->pre && !TEST(DRSYS_PARAM_IN, arg->mode)) { OUTPUT(buf, PFX, arg->value); } else { if (!print_known_compound_type(buf, arg->type, (void *) arg->value)) OUTPUT(buf, "<NYI>"); } } } OUTPUT(buf, " (%s%s%stype=%s%s, size="PIFX")\n", (arg->arg_name == NULL) ? "" : "name=", (arg->arg_name == NULL) ? "" : arg->arg_name, (arg->arg_name == NULL) ? "" : ", ", (arg->type_name == NULL) ? "\"\"" : arg->type_name, (arg->type_name == NULL || TESTANY(DRSYS_PARAM_INLINED|DRSYS_PARAM_RETVAL, arg->mode)) ? "" : "*", arg->size); }
static void print_arg(drsys_arg_t *arg) { if (arg->ordinal == -1) OUTPUT("\tretval: "); else OUTPUT("\targ %d: ", arg->ordinal); /* XXX: add return value to dr_fprintf so we can more easily align * after PFX vs PIFX w/o having to print to buffer */ switch (arg->type) { case DRSYS_TYPE_VOID: print_simple_value(arg, true); break; case DRSYS_TYPE_POINTER: print_simple_value(arg, true); break; case DRSYS_TYPE_BOOL: print_simple_value(arg, false); break; case DRSYS_TYPE_INT: print_simple_value(arg, false); break; case DRSYS_TYPE_SIGNED_INT: print_simple_value(arg, false); break; case DRSYS_TYPE_UNSIGNED_INT: print_simple_value(arg, false); break; case DRSYS_TYPE_HANDLE: print_simple_value(arg, false); break; case DRSYS_TYPE_NTSTATUS: print_simple_value(arg, false); break; case DRSYS_TYPE_ATOM: print_simple_value(arg, false); break; default: { if (arg->value == 0) { OUTPUT("<null>"); } else if (arg->pre && !TEST(DRSYS_PARAM_IN, arg->mode)) { OUTPUT(PFX, arg->value); } else { switch (arg->type) { case DRSYS_TYPE_UNICODE_STRING: { print_unicode_string((UNICODE_STRING *) arg->value); break; } case DRSYS_TYPE_OBJECT_ATTRIBUTES: { OBJECT_ATTRIBUTES *oa = (OBJECT_ATTRIBUTES *) arg->value; OUTPUT("len="PIFX", root="PIFX", name=", oa->Length, oa->RootDirectory); print_unicode_string(oa->ObjectName); OUTPUT(", att="PIFX", sd="PFX", sqos="PFX, oa->Attributes, oa->SecurityDescriptor, oa->SecurityQualityOfService); break; } case DRSYS_TYPE_IO_STATUS_BLOCK: { IO_STATUS_BLOCK *io = (IO_STATUS_BLOCK *) arg->value; OUTPUT("status="PIFX", info="PIFX"", io->StatusPointer.Status, io->Information); break; } case DRSYS_TYPE_LARGE_INTEGER: { LARGE_INTEGER *li = (LARGE_INTEGER *) arg->value; OUTPUT("0x"HEX64_FORMAT_STRING, li->QuadPart); break; } default: { /* FIXME i#1089: add the other types */ OUTPUT("<NYI>"); } } /* XXX: we want KEY_VALUE_PARTIAL_INFORMATION, etc. like in * syscall_diagnostics. Add drsyscall types for those, or hardcode here? */ } } } OUTPUT(" (%s%s%stype=%s%s, size="PIFX")\n", (arg->arg_name == NULL) ? "" : "name=", (arg->arg_name == NULL) ? "" : arg->arg_name, (arg->arg_name == NULL) ? "" : ", ", (arg->type_name == NULL) ? "\"\"" : arg->type_name, (arg->type_name == NULL || TESTANY(DRSYS_PARAM_INLINED|DRSYS_PARAM_RETVAL, arg->mode)) ? "" : "*", arg->size); }