ReactOS 0.4.15-dev-7931-gfd331f1
enum.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TDI interface
4 * FILE: enum.c
5 * PURPOSE: TDI entity enumeration
6 */
7
8#include "precomp.h"
9
10#include "tdilib.h"
11
12/* A generic thing-getting function which interacts in the right way with
13 * TDI. This may seem oblique, but I'm using it to reduce code and hopefully
14 * make this thing easier to debug.
15 *
16 * The things returned can be any of:
17 * TDIEntityID
18 * TDIObjectID
19 * IFEntry
20 * IPSNMPInfo
21 * IPAddrEntry
22 * IPInterfaceInfo
23 */
25 DWORD toiClass,
26 DWORD toiType,
27 DWORD toiId,
28 DWORD teiEntity,
29 DWORD teiInstance,
30 DWORD fixedPart,
31 DWORD entrySize,
32 PVOID *tdiEntitySet,
33 PDWORD numEntries ) {
35 PVOID entitySet = 0;
37 DWORD allocationSizeForEntityArray = entrySize * MAX_TDI_ENTITIES;
39
40 req.ID.toi_class = toiClass;
41 req.ID.toi_type = toiType;
42 req.ID.toi_id = toiId;
43 req.ID.toi_entity.tei_entity = teiEntity;
44 req.ID.toi_entity.tei_instance = teiInstance;
45
46 /* There's a subtle problem here...
47 * If an interface is added at this exact instant, (as if by a PCMCIA
48 * card insertion), the array will still not have enough entries after
49 * have allocated it after the first DeviceIoControl call.
50 *
51 * We'll get around this by repeating until the number of interfaces
52 * stabilizes.
53 */
54 do {
56 NULL,
57 NULL,
58 NULL,
59 &Iosb,
61 &req,
62 sizeof(req),
63 NULL,
64 0);
66 {
68 if (NT_SUCCESS(status)) status = Iosb.Status;
69 }
70
71 if(!NT_SUCCESS(status))
72 {
73 return status;
74 }
75
76 allocationSizeForEntityArray = Iosb.Information;
77 entitySet = HeapAlloc( GetProcessHeap(), 0, allocationSizeForEntityArray );
78
79 if( !entitySet ) {
81 return status;
82 }
83
85 NULL,
86 NULL,
87 NULL,
88 &Iosb,
90 &req,
91 sizeof(req),
92 entitySet,
93 allocationSizeForEntityArray);
95 {
97 if (NT_SUCCESS(status)) status = Iosb.Status;
98 }
99
100 /* This is why we have the loop -- we might have added an adapter */
101 if( Iosb.Information == allocationSizeForEntityArray )
102 break;
103
104 HeapFree( GetProcessHeap(), 0, entitySet );
105 entitySet = 0;
106
107 if(!NT_SUCCESS(status))
108 return status;
109 } while( TRUE ); /* We break if the array we received was the size we
110 * expected. Therefore, we got here because it wasn't */
111
112 *numEntries = (allocationSizeForEntityArray - fixedPart) / entrySize;
113 *tdiEntitySet = entitySet;
114
115 return STATUS_SUCCESS;
116}
117
119 HeapFree( GetProcessHeap(), 0, things );
120}
121
123 TDIEntityID **entitySet,
124 PDWORD numEntities ) {
130 0,
131 0,
132 sizeof(TDIEntityID),
133 (PVOID *)entitySet,
134 numEntities );
135
136 return status;
137}
138
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
return Iosb
Definition: create.c:4402
unsigned long DWORD
Definition: ntddk_ex.h:95
#define TCP_REQUEST_QUERY_INFORMATION_INIT
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
#define STATUS_PENDING
Definition: ntstatus.h:82
DWORD * PDWORD
Definition: pedump.c:68
NTSTATUS tdiGetSetOfThings(HANDLE tcpFile, DWORD toiClass, DWORD toiType, DWORD toiId, DWORD teiEntity, DWORD teiInstance, DWORD fixedPart, DWORD entrySize, PVOID *tdiEntitySet, PDWORD numEntries)
Definition: enum.c:24
VOID tdiFreeThingSet(PVOID things)
Definition: enum.c:118
NTSTATUS tdiGetEntityIDSet(HANDLE tcpFile, TDIEntityID **entitySet, PDWORD numEntities)
Definition: enum.c:122
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG tei_entity
Definition: tdiinfo.h:31
ULONG tei_instance
Definition: tdiinfo.h:32
ULONG toi_id
Definition: tdiinfo.h:77
ULONG toi_type
Definition: tdiinfo.h:76
ULONG toi_class
Definition: tdiinfo.h:75
TDIEntityID toi_entity
Definition: tdiinfo.h:74
Definition: ps.c:97
#define ENTITY_LIST_ID
Definition: tdiinfo.h:38
#define MAX_TDI_ENTITIES
Definition: tdiinfo.h:35
#define INFO_CLASS_GENERIC
Definition: tdiinfo.h:64
#define INFO_TYPE_PROVIDER
Definition: tdiinfo.h:69
#define GENERIC_ENTITY
Definition: tdiinfo.h:37
#define IOCTL_TCP_QUERY_INFORMATION_EX
Definition: tditest.h:110
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158