1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-27 03:21:53 +03:00

give far more detail in the EPMAPPER results

This commit is contained in:
Andrew Tridgell 0001-01-01 00:00:00 +00:00
parent 4a6034f2e3
commit 4203019698
3 changed files with 107 additions and 31 deletions

View File

@ -30,12 +30,12 @@ definition : cpp_prefix
| function { $item[1] }
| const { $item[1] }
const : 'const' <commit> identifier identifier '=' constant ';'
const : 'const' <commit> identifier identifier '=' anytext ';'
{{
"TYPE" => "CONST",
"DTYPE" => $item[3],
"NAME" => $item[4],
"VALUE" => $item{constant}
"VALUE" => $item{anytext}
}}
| <error?>
@ -166,7 +166,7 @@ type :
text: /[\w\s\..?-]*/
text2: /[\|\w\s,\*\>\/\..?-]*/
text2: /[\|\w\s,\*\>"\/\..?-]*/
anytext: text2 '(' <commit> anytext ')' anytext
{{ "$item[1]($item[4])$item[6]" }}

View File

@ -20,6 +20,9 @@ interface epmapper
with.
*/
/* this guid indicates NDR encoding in a protocol tower */
const string NDR_GUID = "8a885d04-1ceb-11c9-9fe8-08002b104860";
typedef struct {
GUID uuid;
uint16 version;
@ -36,7 +39,7 @@ interface epmapper
} epm_lhs;
typedef struct {
uint16 unknown;
[flag(NDR_REMAINING)] DATA_BLOB data;
} epm_rhs;
typedef struct {
@ -57,11 +60,11 @@ interface epmapper
typedef struct {
uint32 tower_length;
[subcontext(4)] epm_towers towers;
} twr_t;
} epm_twr_t;
typedef struct {
GUID object;
twr_t *tower;
epm_twr_t *tower;
ascstr2 annotation;
} epm_entry_t;
@ -77,7 +80,7 @@ interface epmapper
[in] uint32 num_ents,
[in,size_is(num_ents)] epm_entry_t entries[],
[in] uint32 replace,
[out] error_status_t *status
[out] error_status_t status
);
/**********************/
@ -85,7 +88,7 @@ interface epmapper
void epm_Delete(
[in] uint32 num_ents,
[in, size_is(num_ents)] epm_entry_t entries[],
[out] error_status_t *status
[out] error_status_t status
);
/**********************/
@ -107,32 +110,32 @@ interface epmapper
/* Function 0x03 */
typedef struct {
twr_t *twr;
} twr_p_t;
epm_twr_t *twr;
} epm_twr_p_t;
void epm_Map(
[in] GUID *object,
[in] twr_t *map_tower,
[in, out] policy_handle *entry_handle,
[in] epm_twr_t *map_tower,
[in,out,ref] policy_handle *entry_handle,
[in] uint32 max_towers,
[out] uint32 *num_towers,
[out, length_is(*num_towers), size_is(max_towers)] twr_p_t towers[],
[out] error_status_t *status
[out] uint32 num_towers,
[out, length_is(num_towers), size_is(max_towers)] epm_twr_p_t towers[],
[out] error_status_t status
);
/**********************/
/* Function 0x04 */
void epm_LookupHandleFree(
[in, out] policy_handle *entry_handle,
[out] error_status_t *status
[in,out,ref] policy_handle *entry_handle,
[out] error_status_t status
);
/**********************/
/* Function 0x05 */
void epm_InqObject(
[out] GUID *epm_object,
[out] error_status_t *status
[out] error_status_t status
);
@ -141,7 +144,7 @@ interface epmapper
void epm_MgmtDelete(
[in] uint32 object_speced,
[in] GUID *object,
[in] twr_t *tower,
[out] error_status_t *status
[in] epm_twr_t *tower,
[out] error_status_t status
);
}

View File

@ -22,6 +22,80 @@
#include "includes.h"
/*
display any protocol tower
*/
static void display_tower(TALLOC_CTX *mem_ctx, struct epm_towers *twr)
{
int i;
const char *uuid;
for (i=0;i<twr->num_floors;i++) {
struct epm_lhs *lhs = &twr->floors[i].lhs;
struct epm_rhs *rhs = &twr->floors[i].rhs;
switch (lhs->protocol) {
case 0xd:
uuid = GUID_string(mem_ctx, &lhs->info.uuid.uuid);
if (strcasecmp(uuid, NDR_GUID) == 0) {
printf(" NDR");
} else {
printf(" uuid %s/0x%02x", uuid, lhs->info.uuid.version);
}
break;
case 0xb:
printf(" RPC-C");
break;
case 0x9:
printf(" IP:");
if (rhs->data.length == 4) {
struct in_addr in;
in.s_addr = RIVAL(rhs->data.data, 0);
printf("%s", inet_ntoa(in));
}
break;
case 0x10:
printf(" PIPE:%.*s", rhs->data.length, rhs->data.data);
break;
case 0x0f:
printf(" SMBNP:%.*s", rhs->data.length, rhs->data.data);
break;
case 0x11:
printf(" SMB:%.*s", rhs->data.length, rhs->data.data);
break;
case 0x01:
printf(" UNK(1):%.*s", rhs->data.length, rhs->data.data);
break;
case 0x1f:
printf(" TCP:");
if (rhs->data.length == 2) {
printf("%d", SVAL(rhs->data.data, 0));
}
break;
case 0x07:
printf(" XXX:");
if (rhs->data.length == 2) {
printf("%d", SVAL(rhs->data.data, 0));
}
break;
default:
printf(" UNK(%02x):", lhs->protocol);
if (rhs->data.length == 2) {
printf("%d", SVAL(rhs->data.data, 0));
}
break;
}
}
printf("\n");
}
static BOOL test_Lookup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
{
NTSTATUS status;
@ -29,7 +103,6 @@ static BOOL test_Lookup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
struct GUID uuid;
struct rpc_if_id_t iface;
struct policy_handle handle;
int i;
ZERO_STRUCT(uuid);
ZERO_STRUCT(iface);
@ -41,20 +114,20 @@ static BOOL test_Lookup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
r.in.vers_option = 0;
r.in.entry_handle = &handle;
r.out.entry_handle = &handle;
r.in.max_ents = 1;
r.in.max_ents = 10;
do {
status = dcerpc_epm_Lookup(p, mem_ctx, &r);
if (NT_STATUS_IS_OK(status) && r.out.status == 0) {
printf("Found '%s'\n", r.out.entries[0].annotation);
for (i=0;i<r.out.entries[0].tower->towers.num_floors;i++) {
struct epm_lhs *lhs = &r.out.entries[0].tower->towers.floors[i].lhs;
if (lhs->protocol == 13) {
NDR_PRINT_DEBUG(epm_prot_uuid, &lhs->info.uuid);
int i;
for (i=0;i<r.out.num_ents;i++) {
printf("Found '%s'\n", r.out.entries[i].annotation);
display_tower(mem_ctx, &r.out.entries[i].tower->towers);
}
}
}
} while (NT_STATUS_IS_OK(status) && r.out.status == 0);
} while (NT_STATUS_IS_OK(status) &&
r.out.status == 0 &&
r.out.num_ents == r.in.max_ents);
if (!NT_STATUS_IS_OK(status)) {
printf("Lookup failed - %s\n", nt_errstr(status));