void print_normal_string(va_list *va, t_flags *flag, t_info *list) { void *x; int len; if (flag->sub_specifier[0] == 'l' && !flag->sub_specifier[1]) return (print_unicode_string(va, flag, list)); x = va_arg(*va, void*); if (!x) x = "(null)"; flag->i = -1; len = get_nb_min_char_string(flag, (char *)x); while (!flag->minus && flag->is_min_area_size_here && ++flag->i < flag->nb_min_char) flag->zero ? bufferujoin(list, 48) : bufferujoin(list, 32); flag->i = -1; while (flag->is_precision_here && ++flag->i < flag->nb_max_char) bufferujoin(list, 32); if (len) bufferjoin(list, (char*)x, len); flag->i = -1; while (flag->minus && flag->is_min_area_size_here && ++flag->i < flag->nb_min_char) bufferujoin(list, 32); }
static bool print_known_compound_type(buf_info_t *buf, drsys_param_type_t type, void *start_addr) { switch (type) { case DRSYS_TYPE_UNICODE_STRING: { print_unicode_string(buf, (UNICODE_STRING *) start_addr); break; } case DRSYS_TYPE_OBJECT_ATTRIBUTES: { OBJECT_ATTRIBUTES *oa = (OBJECT_ATTRIBUTES *) start_addr; OUTPUT(buf, "len="PIFX", root="PIFX", name=", oa->Length, oa->RootDirectory); print_unicode_string(buf, oa->ObjectName); OUTPUT(buf, ", 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 *) start_addr; OUTPUT(buf, "status="PIFX", info="PIFX"", io->StatusPointer.Status, io->Information); break; } case DRSYS_TYPE_LARGE_INTEGER: { LARGE_INTEGER *li = (LARGE_INTEGER *) start_addr; OUTPUT(buf, "0x"HEX64_FORMAT_STRING, li->QuadPart); break; } default: { /* FIXME i#1089: add the other types */ return false; } } /* XXX: we want KEY_VALUE_PARTIAL_INFORMATION, etc. like in * syscall_diagnostics. Add drsyscall types for those, or hardcode here? */ return true; }
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); }