Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

805 lines
29 KiB

  1. /*++
  2. Copyright (c) 1991 Microsoft Corporation
  3. (c) 1991 Nokia Data Systems AB
  4. Module Name:
  5. ntccbs.h
  6. Abstract:
  7. This file defines the internal DLC API data structures used by
  8. Windows/NT DLC. Most parameter structures are copied directly,
  9. but here are also defined some new structures for internal use.
  10. Author:
  11. Antti Saarenheimo [o-anttis] 6-JUNE-1991
  12. Revision History:
  13. --*/
  14. /*
  15. The commands in alphanumeric order (just saved here)
  16. LLC_BUFFER_CREATE 0x0025
  17. LLC_BUFFER_FREE 0x0027
  18. LLC_BUFFER_GET 0x0026
  19. LLC_DIR_CLOSE_ADAPTER 0x0004
  20. LLC_DIR_CLOSE_DIRECT 0x0034
  21. LLC_DIR_INITIALIZE 0x0020
  22. LLC_DIR_INTERRUPT 0x0000
  23. LLC_DIR_OPEN_ADAPTER 0x0003
  24. LLC_DIR_OPEN_DIRECT 0x0035
  25. LLC_DIR_READ_LOG 0x0008
  26. LLC_DIR_SET_EXCEPTION_FLAGS 0x002D
  27. LLC_DIR_SET_FUNCTIONAL_ADDRESS 0x0007
  28. LLC_DIR_SET_GROUP_ADDRESS 0x0006
  29. LLC_DIR_STATUS 0x0021
  30. LLC_DIR_TIMER_CANCEL 0x0023
  31. LLC_DIR_TIMER_CANCEL_GROUP 0x002C
  32. LLC_DIR_TIMER_SET 0x0022
  33. LLC_DLC_CLOSE_SAP 0x0016
  34. LLC_DLC_CLOSE_STATION 0x001A
  35. LLC_DLC_CONNECT_STATION 0x001B
  36. LLC_DLC_FLOW_CONTROL 0x001D
  37. LLC_DLC_MODIFY 0x001C
  38. LLC_DLC_OPEN_SAP 0x0015
  39. LLC_DLC_OPEN_STATION 0x0019
  40. LLC_DLC_REALLOCATE_STATIONS 0x0017
  41. LLC_DLC_RESET 0x0014
  42. LLC_DLC_SET_THRESHOLD 0x0033
  43. LLC_DLC_STATISTICS 0x001E
  44. LLC_READ 0x0031
  45. LLC_READ_CANCEL 0x0032
  46. LLC_RECEIVE 0x0028
  47. LLC_RECEIVE_CANCEL 0x0029
  48. LLC_RECEIVE_MODIFY 0x002A
  49. LLC_TRANSMIT_DIR_FRAME 0x000A
  50. LLC_TRANSMIT_FRAMES 0x0009
  51. LLC_TRANSMIT_I_FRAME 0x000B
  52. LLC_TRANSMIT_TEST_CMD 0x0011
  53. LLC_TRANSMIT_UI_FRAME 0x000D
  54. LLC_TRANSMIT_XID_CMD 0x000E
  55. LLC_TRANSMIT_XID_RESP_FINAL 0x000F
  56. LLC_TRANSMIT_XID_RESP_NOT_FINAL 0x0010
  57. */
  58. //
  59. // Change this version number whenever the driver-acslan api has
  60. // been changed or both modules must be changed.
  61. //
  62. #define NT_DLC_IOCTL_VERSION 1
  63. //
  64. // Defines the maximum number of buffer segments used in a transmit.
  65. // Max IBM token-ring frame may consist about 72 buffers ((18 * 4) * 256),
  66. // if the application uses 256 bytes as its buffer size.
  67. //
  68. #define MAX_TRANSMIT_SEGMENTS 128 // takes about 1 kB in stack!!!
  69. //
  70. // We use three different CCB structures: the first one is needed
  71. // to allocate space for whole ccb, if READ and RECEIVE parameter table
  72. // is catenated to CCB structure (=> we have only one output buffer).
  73. // The second input CCB buffer is used with the commands having no
  74. // input parameters except those in CCB parameter table field
  75. // (all close commands, DirTimerSet).
  76. // The last buffer is always returned by asynchronous dlc commands.
  77. //
  78. typedef struct _NT_DLC_CCB {
  79. IN UCHAR uchAdapterNumber; // Adapter 0 or 1
  80. IN UCHAR uchDlcCommand; // DLC command
  81. OUT UCHAR uchDlcStatus; // DLC command completion code
  82. OUT UCHAR uchInformation; // # successful transmits
  83. IN PVOID pCcbAddress;
  84. IN ULONG CommandCompletionFlag;
  85. union {
  86. IN PLLC_PARMS pParameterTable; // pointer to the parameter table
  87. IN PVOID pMdl;
  88. struct {
  89. IN USHORT usStationId; // Station id
  90. IN USHORT usParameter; // optional parameter
  91. } dlc;
  92. struct {
  93. IN USHORT usParameter0; // first optional parameter
  94. IN USHORT usParameter1; // second optional parameter
  95. } dir;
  96. IN UCHAR auchBuffer[4]; // group/functional address
  97. IN ULONG ulParameter;
  98. } u;
  99. ULONG Reserved1;
  100. ULONG Reserved2;
  101. // (I am still thinking about this):
  102. //
  103. // The multiple frame transmit should return the number a successfully
  104. // sent frames or otherwise it's not useable for higher protocols.
  105. // We should actually free the transmit buffers only as far as the
  106. // transmits succeeds. The buffers should not be released after the
  107. // first error, because then the data would be lost for ever. The only thing
  108. // the user need to know is how many sequestial frames were sent successfully.
  109. // The number is also the index of the first failed frame, when one
  110. // of the frames fails. The frames are not necessary completed in
  111. // same order, because the error may happed in DlcTransmit, LlcSendX or
  112. // asynchronoulsy (eg. link lost) => we need the index of the first
  113. // failing frame. The frame must not be released, if its index is higher
  114. // than that of the first failed frame. A new error (async) be overwrite
  115. // an earlier (sync) error having higher sequency number.
  116. // Initially the number of successful frames is -1 and each frame of
  117. // the multiple send needs a sequency number. The last frame copies
  118. // own sequency number (added by one) to the CCB.
  119. //
  120. // ULONG cSuccessfulTransmits; // REMOVE Reserved2!!!!!
  121. //
  122. } NT_DLC_CCB, *PNT_DLC_CCB;
  123. typedef struct _NT_DLC_CCB_INPUT {
  124. IN UCHAR uchAdapterNumber; // Adapter 0 or 1
  125. IN UCHAR uchDlcCommand; // DLC command
  126. OUT UCHAR uchDlcStatus; // DLC command completion code
  127. UCHAR uchReserved1; // reserved for DLC DLL
  128. OUT PVOID pCcbAddress; //
  129. IN ULONG CommandCompletionFlag;
  130. union {
  131. IN OUT PLLC_PARMS pParameterTable; // pointer to the parameter table
  132. struct {
  133. IN USHORT usStationId; // Station id
  134. IN USHORT usParameter; // optional parameter
  135. } dlc;
  136. struct {
  137. IN USHORT usParameter0; // first optional parameter
  138. IN USHORT usParameter1; // second optional parameter
  139. } dir;
  140. IN UCHAR auchBuffer[4]; // group/functional address
  141. IN ULONG ulParameter;
  142. } u;
  143. } NT_DLC_CCB_INPUT, *PNT_DLC_CCB_INPUT;
  144. typedef struct _NT_DLC_CCB_OUTPUT {
  145. IN UCHAR uchAdapterNumber; // Adapter 0 or 1
  146. IN UCHAR uchDlcCommand; // DLC command
  147. OUT UCHAR uchDlcStatus; // DLC command completion code
  148. UCHAR uchReserved1; // reserved for DLC DLL
  149. OUT PVOID pCcbAddress; //
  150. } NT_DLC_CCB_OUTPUT, *PNT_DLC_CCB_OUTPUT;
  151. typedef struct _NT_DLC_TRANSMIT2_CCB_OUTPUT {
  152. IN UCHAR uchAdapterNumber; // Adapter 0 or 1
  153. IN UCHAR uchDlcCommand; // DLC command
  154. OUT UCHAR uchDlcStatus; // DLC command completion code
  155. UCHAR uchReserved1; // reserved for DLC DLL
  156. OUT PVOID pCcbAddress; //
  157. } NT_DLC_TRANSMIT2_CCB_OUTPUT, *PNT_DLC_CCB_TRANSMIT2_OUTPUT;
  158. //
  159. // BUFFER.FREE
  160. //
  161. // DlcCommand = 0x27
  162. //
  163. // Internal NT DLC API data structure.
  164. //
  165. typedef struct _NT_DLC_BUFFER_FREE_PARMS {
  166. IN USHORT Reserved1;
  167. OUT USHORT cBuffersLeft;
  168. IN USHORT BufferCount;
  169. IN USHORT Reserved2;
  170. IN LLC_TRANSMIT_DESCRIPTOR DlcBuffer[1];
  171. } NT_DLC_BUFFER_FREE_PARMS, *PNT_DLC_BUFFER_FREE_PARMS;
  172. typedef struct _NT_DLC_BUFFER_FREE_ALLOCATION {
  173. IN USHORT Reserved1;
  174. OUT USHORT cBuffersLeft;
  175. IN USHORT BufferCount;
  176. IN USHORT Reserved2;
  177. IN LLC_TRANSMIT_DESCRIPTOR DlcBuffer[MAX_TRANSMIT_SEGMENTS];
  178. } NT_DLC_BUFFER_FREE_ALLOCATION, *PNT_DLC_BUFFER_FREE_ALLOCATION;
  179. typedef struct _NT_DLC_BUFFER_FREE_OUTPUT {
  180. IN USHORT Reserved2;
  181. OUT USHORT cBuffersLeft;
  182. } NT_DLC_BUFFER_FREE_OUTPUT, *PNT_DLC_BUFFER_FREE_OUTPUT;
  183. //
  184. // DLC_CONNECT_STATION
  185. //
  186. // DlcCommand = 0x1b
  187. // (copied by DLC API)
  188. //
  189. #define DLC_MAX_ROUTING_INFOMATION 18
  190. typedef struct _NT_DLC_CONNECT_STATION_PARMS {
  191. IN LLC_CCB Ccb;
  192. IN USHORT Reserved;
  193. IN USHORT StationId;
  194. IN UCHAR aRoutingInformation[DLC_MAX_ROUTING_INFOMATION];
  195. IN USHORT RoutingInformationLength;
  196. } NT_DLC_CONNECT_STATION_PARMS, *PNT_DLC_CONNECT_STATION_PARMS;
  197. //
  198. // DLC_FLOW_CONTROL
  199. //
  200. // DlcCommand = 0x1d
  201. // (copied by DLC API)
  202. //
  203. #define LLC_VALID_FLOW_CONTROL_BITS 0xc0
  204. //
  205. // This is special DOS DLC extensions to generate
  206. // dlc local busy (dos dlc buffer) indication from
  207. // dos dlc support dll.
  208. //
  209. #define LLC_SET_LOCAL_BUSY_BUFFER 0x20
  210. #define LLC_DOS_DLC_FLOW_CONTROL 0x1f
  211. typedef struct _NT_DLC_FLOW_CONTROL_PARMS {
  212. IN USHORT StationId;
  213. IN UCHAR FlowControlOption;
  214. IN UCHAR Reserved;
  215. } NT_DLC_FLOW_CONTROL_PARMS, *PNT_DLC_FLOW_CONTROL_PARMS;
  216. //
  217. // DLC_SET_INFORMATION
  218. //
  219. // This command is used to set the parameters of a link
  220. // station or a sap. A null field in the station id struct
  221. // defines a
  222. //
  223. // DlcCommand = 0x1c
  224. //
  225. //
  226. // Info classes for datalink Set/Query Information
  227. //
  228. enum _DLC_INFO_CLASS_TYPES {
  229. DLC_INFO_CLASS_STATISTICS, // get
  230. DLC_INFO_CLASS_STATISTICS_RESET, // get and reset
  231. DLC_INFO_CLASS_DLC_TIMERS, // get/set
  232. DLC_INFO_CLASS_DIR_ADAPTER, // get
  233. DLC_INFO_CLASS_DLC_ADAPTER, // get
  234. DLC_INFO_CLASS_PERMANENT_ADDRESS, // get
  235. DLC_INFO_CLASS_LINK_STATION, // set
  236. DLC_INFO_CLASS_DIRECT_INFO, // set
  237. DLC_INFO_CLASS_GROUP, // set
  238. DLC_INFO_CLASS_RESET_FUNCTIONAL, // set
  239. DLC_INFO_CLASS_SET_GROUP, // set / get
  240. DLC_INFO_CLASS_SET_FUNCTIONAL, // set / get
  241. DLC_INFO_CLASS_ADAPTER_LOG, // get
  242. DLC_INFO_CLASS_SET_MULTICAST // set
  243. };
  244. #define DLC_MAX_GROUPS 127 // max for group saps
  245. typedef struct _LinkStationInfoSet {
  246. IN UCHAR TimerT1;
  247. IN UCHAR TimerT2;
  248. IN UCHAR TimerTi;
  249. IN UCHAR MaxOut;
  250. IN UCHAR MaxIn;
  251. IN UCHAR MaxOutIncrement;
  252. IN UCHAR MaxRetryCount;
  253. IN UCHAR TokenRingAccessPriority;
  254. IN USHORT MaxInformationField;
  255. } DLC_LINK_PARAMETERS, * PDLC_LINK_PARAMETERS;
  256. typedef struct _LLC_TICKS {
  257. UCHAR T1TickOne; // default short delay for response timer
  258. UCHAR T2TickOne; // default short delay for ack delay timer
  259. UCHAR TiTickOne; // default short delay for inactivity timer
  260. UCHAR T1TickTwo; // default short delay for response timer
  261. UCHAR T2TickTwo; // default short delay for ack delay timer
  262. UCHAR TiTickTwo; // default short delay for inactivity timer
  263. } LLC_TICKS, *PLLC_TICKS;
  264. typedef union _TR_BROADCAST_ADDRESS
  265. {
  266. ULONG ulAddress;
  267. UCHAR auchAddress[4];
  268. } TR_BROADCAST_ADDRESS, *PTR_BROADCAST_ADDRESS;
  269. typedef struct _NT_DLC_SET_INFORMATION_PARMS {
  270. struct _DlcSetInfoHeader {
  271. IN USHORT StationId;
  272. IN USHORT InfoClass;
  273. } Header;
  274. union {
  275. // InfoClass = DLC_INFO_CLASS_LINK_STATION
  276. DLC_LINK_PARAMETERS LinkStation;
  277. // InfoClass = DLC_INFO_CLASS_GROUP
  278. struct _DlcSapInfoSet {
  279. IN UCHAR GroupCount;
  280. IN UCHAR GroupList[DLC_MAX_GROUPS];
  281. } Sap;
  282. // InfoClass = DLC_INFO_CLASS_DIRECT_STATION
  283. struct _DlcDirectStationInfoSet {
  284. IN ULONG FrameMask;
  285. } Direct;
  286. // InfoClass = DLC_INFO_CLASS_DLC_TIMERS
  287. LLC_TICKS TimerParameters;
  288. // InfoClass = DLC_INFO_CLASS_SET_FUNCTIONAL
  289. // InfoClass = DLC_INFO_CLASS_RESET_FUNCTIONAL
  290. // InfoClass = DLC_INFO_CLASS_SET_GROUP
  291. UCHAR Buffer[1];
  292. // InfoClass = DLC_INFO_CLASS_SET_MULTICAST
  293. UCHAR auchMulticastAddress[6];
  294. TR_BROADCAST_ADDRESS Broadcast;
  295. } Info;
  296. } NT_DLC_SET_INFORMATION_PARMS, *PNT_DLC_SET_INFORMATION_PARMS;
  297. typedef struct _DlcAdapterInfoGet {
  298. OUT UCHAR MaxSap;
  299. OUT UCHAR OpenSaps;
  300. OUT UCHAR MaxStations;
  301. OUT UCHAR OpenStations;
  302. OUT UCHAR AvailStations;
  303. } LLC_ADAPTER_DLC_INFO, *PLLC_ADAPTER_DLC_INFO;
  304. //
  305. // This structure is tailored for DLC DirOpenAdapter and DirStatus
  306. // functions.
  307. //
  308. typedef struct _LLC_ADAPTER_INFO {
  309. UCHAR auchNodeAddress[6];
  310. UCHAR auchGroupAddress[4];
  311. UCHAR auchFunctionalAddress[4];
  312. USHORT usAdapterType; // (struct may not be dword align!)
  313. USHORT usReserved;
  314. USHORT usMaxFrameSize;
  315. ULONG ulLinkSpeed;
  316. } LLC_ADAPTER_INFO, *PLLC_ADAPTER_INFO;
  317. //
  318. // DLC_QUERY_INFOMATION
  319. //
  320. // This command is used to set the parameters of a link
  321. // station or a sap. A null field in the station id struct
  322. // defines a
  323. //
  324. // DlcCommand =
  325. //
  326. typedef union _NT_DLC_QUERY_INFORMATION_OUTPUT {
  327. // (Query dlc parameters not used by DLC)
  328. // // InfoClass = DLC_INFO_CLASS_STATION_INFO for link station
  329. // DLC_LINK_PARAMETERS Link;
  330. // // InfoClass = DLC_INFO_CLASS_DIRECT_INFO for direct station
  331. // struct _DlcDirectStationInfoGet {
  332. // OUT ULONG FrameMask;
  333. // } Direct;
  334. // InfoClass = DLC_INFO_CLASS_DIR_ADAPTER;
  335. LLC_ADAPTER_INFO DirAdapter;
  336. // InfoClass = DLC_INFO_CLASS_SAP
  337. struct _DlcSapInfoGet {
  338. OUT USHORT MaxInformationField;
  339. OUT UCHAR MaxMembers;
  340. OUT UCHAR GroupCount;
  341. OUT UCHAR GroupList[DLC_MAX_GROUPS];
  342. } Sap;
  343. // InfoClass = DLC_INFO_CLASS_LINK_STATION
  344. struct _DlcLinkInfoGet {
  345. OUT USHORT MaxInformationField;
  346. } Link;
  347. // InfoClass = DLC_INFO_CLASS_DLC_ADAPTER
  348. LLC_ADAPTER_DLC_INFO DlcAdapter;
  349. // struct _DlcInfoSetBroadcast Broadcast;
  350. // InfoClass = DLC_INFO_CLASS_DLC_TIMERS
  351. LLC_TICKS TimerParameters;
  352. // InfoClass = DLC_INFO_CLASS_ADAPTER_LOG
  353. LLC_ADAPTER_LOG AdapterLog;
  354. // InfoClass = DLC_INFO_CLASS_SET_FUNCTIONAL
  355. // InfoClass = DLC_INFO_CLASS_RESET_FUNCTIONAL
  356. // InfoClass = DLC_INFO_CLASS_SET_GROUP
  357. UCHAR Buffer[1];
  358. } NT_DLC_QUERY_INFORMATION_OUTPUT, *PNT_DLC_QUERY_INFORMATION_OUTPUT;
  359. typedef struct _NT_DLC_QUERY_INFORMATION_INPUT {
  360. IN USHORT StationId;
  361. IN USHORT InfoClass;
  362. } NT_DLC_QUERY_INFORMATION_INPUT, *PNT_DLC_QUERY_INFORMATION_INPUT;
  363. typedef union _NT_DLC_QUERY_INFORMATION_PARMS {
  364. NT_DLC_QUERY_INFORMATION_INPUT Header;
  365. NT_DLC_QUERY_INFORMATION_OUTPUT Info;
  366. } NT_DLC_QUERY_INFORMATION_PARMS, *PNT_DLC_QUERY_INFORMATION_PARMS;
  367. //
  368. // DLC_OPEN_SAP
  369. //
  370. // DlcCommand = 0x15
  371. //
  372. typedef struct _NT_DLC_OPEN_SAP_PARMS {
  373. OUT USHORT StationId; // SAP or link station id
  374. IN USHORT UserStatusValue;
  375. IN DLC_LINK_PARAMETERS LinkParameters;
  376. IN UCHAR SapValue;
  377. IN UCHAR OptionsPriority;
  378. IN UCHAR StationCount;
  379. IN UCHAR Reserved1[7];
  380. IN ULONG DlcStatusFlag;
  381. IN UCHAR Reserved2[8];
  382. OUT UCHAR AvailableStations; // == StationCount
  383. } NT_DLC_OPEN_SAP_PARMS, *PNT_DLC_OPEN_SAP_PARMS;
  384. //
  385. // NT_DLC_OPEN_STATION
  386. //
  387. // DlcCommand = 0x19
  388. //
  389. //
  390. typedef struct _NT_DLC_OPEN_STATION_PARMS {
  391. IN OUT USHORT LinkStationId;
  392. IN DLC_LINK_PARAMETERS LinkParameters;
  393. IN UCHAR aRemoteNodeAddress[6];
  394. IN UCHAR RemoteSap;
  395. } NT_DLC_OPEN_STATION_PARMS, *PNT_DLC_OPEN_STATION_PARMS;
  396. //
  397. // NT_DLC_SET_TRESHOLD
  398. //
  399. // DlcCommand = 0x33
  400. //
  401. //typedef struct _NT_DLC_SET_TRESHOLD_PARMS {
  402. // IN USHORT StationId;
  403. // IN USHORT Reserved;
  404. // IN ULONG BufferTresholdSize;
  405. // IN PVOID AlertEvent;
  406. //} NT_DLC_SET_TRESHOLD_PARMS, *PNT_DLC_SET_TRESHOLD_PARMS;
  407. //
  408. // DIR_OPEN_ADAPTER
  409. //
  410. // DlcCommand = 0x03
  411. //
  412. // OUT: Info.ulParameter = BringUpDiagnostics;
  413. //
  414. #ifndef MAX_PATH // I don't want to include whole windows because of this
  415. #define MAX_PATH 260
  416. #endif
  417. typedef struct _NT_DIR_OPEN_ADAPTER_PARMS {
  418. OUT LLC_ADAPTER_OPEN_PARMS Adapter;
  419. IN PVOID pSecurityDescriptor;
  420. IN PVOID hBufferPoolHandle;
  421. IN LLC_ETHERNET_TYPE LlcEthernetType;
  422. IN ULONG NtDlcIoctlVersion;
  423. IN LLC_TICKS LlcTicks;
  424. IN UCHAR AdapterNumber;
  425. IN UCHAR uchReserved;
  426. IN UNICODE_STRING NdisDeviceName;
  427. IN WCHAR Buffer[ MAX_PATH ];
  428. } NT_DIR_OPEN_ADAPTER_PARMS, *PNT_DIR_OPEN_ADAPTER_PARMS;
  429. //
  430. // READ_CANCEL (DlcCommand = 0x32)
  431. // DIR_TIMER_CANCEL (DlcCommand = 0x23)
  432. //
  433. typedef struct _NT_DLC_CANCEL_COMMAND_PARMS {
  434. IN PVOID CcbAddress;
  435. } NT_DLC_CANCEL_COMMAND_PARMS, *PNT_DLC_CANCEL_COMMAND_PARMS;
  436. //
  437. // RECEIVE_CANCEL
  438. //
  439. // DlcCommand = 0x29
  440. //
  441. typedef struct _NT_DLC_RECEIVE_CANCEL_PARMS {
  442. PVOID pCcb;
  443. } NT_DLC_RECEIVE_CANCEL_PARMS, *PNT_DLC_RECEIVE_CANCEL_PARMS;
  444. typedef struct _NT_DLC_COMMAND_CANCEL_PARMS {
  445. PVOID pCcb;
  446. } NT_DLC_COMMAND_CANCEL_PARMS, *PNT_DLC_COMMAND_CANCEL_PARMS;
  447. //
  448. // TRANSMIT_DIR_FRAME
  449. // TRANSMIT_I_FRAME
  450. // TRANSMIT_TEST_CMD
  451. // TRANSMIT_UI_FRAME
  452. // TRANSMIT_XID_CMD
  453. // TRANSMIT_XID_RESP_FINAL
  454. // TRANSMIT_XID_RESP_NOT_FINAL
  455. //
  456. typedef struct _NT_DLC_TRANSMIT_PARMS {
  457. IN USHORT StationId;
  458. IN USHORT FrameType; // DLC frame or ethernet protocol
  459. IN UCHAR RemoteSap OPTIONAL; // used only for DLC types
  460. IN UCHAR XmitReadOption;
  461. OUT UCHAR FrameStatus; // not returned by I or new xmit
  462. IN UCHAR Reserved;
  463. IN ULONG XmitBufferCount;
  464. IN LLC_TRANSMIT_DESCRIPTOR XmitBuffer[1];
  465. } NT_DLC_TRANSMIT_PARMS, *PNT_DLC_TRANSMIT_PARMS;
  466. typedef struct _NT_DLC_TRANSMIT_ALLOCATION {
  467. IN USHORT StationId;
  468. IN USHORT FrameType;
  469. IN UCHAR RemoteSap;
  470. IN UCHAR XmitReadOption;
  471. OUT UCHAR FrameStatus;
  472. IN UCHAR Reserved;
  473. IN ULONG XmitBufferCount;
  474. IN LLC_TRANSMIT_DESCRIPTOR XmitBuffer[MAX_TRANSMIT_SEGMENTS];
  475. } NT_DLC_TRANSMIT_ALLOCATION;
  476. typedef struct _NT_DLC_TRANSMIT_OUTPUT {
  477. OUT UCHAR FrameStatus;
  478. } NT_DLC_TRANSMIT_OUTPUT, *PNT_DLC_TRANSMIT_OUTPUT;
  479. enum _XMIT_READ_OPTION {
  480. DLC_CHAIN_XMIT_IN_LINK = 0,
  481. DLC_DO_NOT_CHAIN_XMIT = 1,
  482. DLC_CHAIN_XMIT_IN_SAP = 2
  483. };
  484. //
  485. // COMPLETE_COMMAND
  486. //
  487. // DlcCommand = 0x??
  488. //
  489. // The command is used to complete all synchronous commands.
  490. // The DLC API library calls the DLC device driver again with
  491. // these parameters, when a synchronous DLC command with
  492. // COMMAND_COMPLETION_FLAG has completed.
  493. // The command completes immediately, but the orginal CCB pointer
  494. // and command completion flag are queued to the even queue
  495. // or completed immediately with a READ command.
  496. // The asynchronous commands are queued immediately when they
  497. // completes, but their
  498. //
  499. typedef struct _NT_DLC_COMPLETE_COMMAND_PARMS {
  500. IN PVOID pCcbPointer;
  501. IN ULONG CommandCompletionFlag;
  502. IN USHORT StationId;
  503. IN USHORT Reserved;
  504. } NT_DLC_COMPLETE_COMMAND_PARMS, *PNT_DLC_COMPLETE_COMMAND_PARMS;
  505. //
  506. // There is a small READ_INPUT parameter structure, because we
  507. // do not want to copy all output parameters in every read request.
  508. //
  509. //
  510. typedef struct _NT_DLC_READ_INPUT {
  511. IN USHORT StationId;
  512. IN UCHAR OptionIndicator;
  513. IN UCHAR EventSet;
  514. IN PVOID CommandCompletionCcbLink;
  515. } NT_DLC_READ_INPUT, * PNT_DLC_READ_INPUT;
  516. //
  517. // This buffer is copied back to user memory, when read parameter table
  518. // is separate from CCB- table.
  519. //
  520. typedef LLC_READ_PARMS LLC_READ_OUTPUT_PARMS, *PLLC_READ_OUTPUT_PARMS;
  521. //typedef struct _LLC_READ_OUTPUT_PARMS {
  522. // IN USHORT usStationId;
  523. // IN UCHAR uchOptionIndicator;
  524. // IN UCHAR uchEventSet;
  525. // OUT UCHAR uchEvent;
  526. // OUT UCHAR uchCriticalSubset;
  527. // OUT ULONG ulNotificationFlag;
  528. // union {
  529. // struct {
  530. // OUT USHORT usCcbCount;
  531. // OUT PLLC_CCB pCcbCompletionList;
  532. // OUT USHORT usBufferCount;
  533. // OUT PLLC_BUFFER pFirstBuffer;
  534. // OUT USHORT usReceivedFrameCount;
  535. // OUT PLLC_BUFFER pReceivedFrame;
  536. // OUT USHORT usEventErrorCode;
  537. // OUT USHORT usEventErrorData[3];
  538. // } Event;
  539. // struct {
  540. // OUT USHORT usStationId;
  541. // OUT USHORT usDlcStatusCode;
  542. // OUT UCHAR uchFrmrData[5];
  543. // OUT UCHAR uchAccessPritority;
  544. // OUT UCHAR uchRemoteNodeAddress[6];
  545. // OUT UCHAR uchRemoteSap;
  546. // OUT UCHAR uchReserved;
  547. // OUT USHORT usUserStatusValue;
  548. // } Status;
  549. // } Type;
  550. //} LLC_READ_OUTPUT_PARMS, *PLLC_READ_OUTPUT_PARMS;
  551. typedef struct _NT_DLC_READ_PARMS {
  552. IN USHORT StationId;
  553. IN UCHAR OptionIndicator;
  554. IN UCHAR EventSet;
  555. OUT UCHAR Event;
  556. OUT UCHAR CriticalSubset;
  557. OUT ULONG NotificationFlag;
  558. union {
  559. struct {
  560. OUT USHORT CcbCount;
  561. OUT PVOID pCcbCompletionList;
  562. OUT USHORT BufferCount;
  563. OUT PLLC_BUFFER pFirstBuffer;
  564. OUT USHORT ReceivedFrameCount;
  565. OUT PLLC_BUFFER pReceivedFrame;
  566. OUT USHORT EventErrorCode;
  567. OUT USHORT EventErrorData[3];
  568. } Event;
  569. struct {
  570. OUT USHORT StationId;
  571. OUT USHORT DlcStatusCode;
  572. OUT UCHAR FrmrData[5];
  573. OUT UCHAR AccessPritority;
  574. OUT UCHAR RemoteNodeAddress[6];
  575. OUT UCHAR RemoteSap;
  576. OUT UCHAR Reserved;
  577. OUT USHORT UserStatusValue;
  578. } Status;
  579. } u;
  580. } NT_DLC_READ_PARMS, *PNT_DLC_READ_PARMS;
  581. typedef struct _LLC_IOCTL_BUFFERS {
  582. USHORT InputBufferSize;
  583. USHORT OutputBufferSize;
  584. } LLC_IOCTL_BUFFERS, *PLLC_IOCTL_BUFFERS;
  585. //
  586. // This table is used by dlc driver and dlcapi dll modules.
  587. // In the application level debug version of dlc we link all modules
  588. // together and this table must be defined only once.
  589. //
  590. #ifdef INCLUDE_IO_BUFFER_SIZE_TABLE
  591. LLC_IOCTL_BUFFERS aDlcIoBuffers[IOCTL_DLC_LAST_COMMAND] =
  592. {
  593. {sizeof(NT_DLC_READ_PARMS) + sizeof( NT_DLC_CCB ),
  594. sizeof( NT_DLC_CCB_OUTPUT )},
  595. {sizeof(LLC_RECEIVE_PARMS) + sizeof( NT_DLC_CCB ),
  596. sizeof( NT_DLC_CCB_OUTPUT )},
  597. {sizeof(NT_DLC_TRANSMIT_PARMS) + sizeof( NT_DLC_CCB ),
  598. sizeof( NT_DLC_CCB_OUTPUT )},
  599. {sizeof(NT_DLC_BUFFER_FREE_PARMS),
  600. sizeof(NT_DLC_BUFFER_FREE_OUTPUT)},
  601. {sizeof(LLC_BUFFER_GET_PARMS),
  602. sizeof(LLC_BUFFER_GET_PARMS)},
  603. {sizeof(LLC_BUFFER_CREATE_PARMS),
  604. sizeof(PVOID)},
  605. // DirInitialize included in DirClose
  606. // {sizeof( NT_DLC_CCB_INPUT ),
  607. // sizeof( NT_DLC_CCB_OUTPUT )}, // DIR.INITIALIZE
  608. {sizeof(LLC_DIR_SET_EFLAG_PARMS),
  609. 0},
  610. {sizeof( NT_DLC_CCB_INPUT ),
  611. sizeof( NT_DLC_CCB_OUTPUT )}, // DLC.CLOSE.STATION
  612. {sizeof(NT_DLC_CONNECT_STATION_PARMS) + sizeof( NT_DLC_CCB ),
  613. sizeof( NT_DLC_CCB_OUTPUT )},
  614. {sizeof(NT_DLC_FLOW_CONTROL_PARMS),
  615. 0},
  616. {sizeof(NT_DLC_OPEN_STATION_PARMS),
  617. sizeof( USHORT )},
  618. {sizeof( NT_DLC_CCB_INPUT ),
  619. sizeof( NT_DLC_CCB_OUTPUT )}, // DLC.RESET
  620. {sizeof(NT_DLC_COMMAND_CANCEL_PARMS),
  621. 0}, // READ.CANCEL
  622. {sizeof(NT_DLC_RECEIVE_CANCEL_PARMS),
  623. 0},
  624. {sizeof(NT_DLC_QUERY_INFORMATION_INPUT),
  625. 0},
  626. {sizeof( struct _DlcSetInfoHeader ),
  627. 0},
  628. {sizeof(NT_DLC_COMMAND_CANCEL_PARMS), // TIMER.CANCEL
  629. 0},
  630. {sizeof( NT_DLC_CCB_INPUT ), // TIMER.CANCEL.GROUP
  631. sizeof( NT_DLC_CCB_OUTPUT )},
  632. {sizeof( NT_DLC_CCB_INPUT ), // DIR.TIMER.SET
  633. sizeof( NT_DLC_CCB_OUTPUT )},
  634. {sizeof(NT_DLC_OPEN_SAP_PARMS),
  635. sizeof(NT_DLC_OPEN_SAP_PARMS)},
  636. {sizeof( NT_DLC_CCB_INPUT ),
  637. sizeof( NT_DLC_CCB_OUTPUT )}, // DLC.CLOSE.SAP
  638. {sizeof(LLC_DIR_OPEN_DIRECT_PARMS),
  639. 0},
  640. {sizeof( NT_DLC_CCB_INPUT ), // DIR.CLOSE.DIRECT
  641. sizeof( NT_DLC_CCB_OUTPUT )},
  642. {sizeof(NT_DIR_OPEN_ADAPTER_PARMS), // DIR.OPEN.ADAPTER
  643. sizeof( LLC_ADAPTER_OPEN_PARMS )},
  644. {sizeof( NT_DLC_CCB_INPUT ), // DIR.CLOSE.ADAPTER
  645. sizeof( NT_DLC_CCB_OUTPUT )},
  646. {sizeof( LLC_DLC_REALLOCATE_PARMS ), // DLC.REALLOCATE
  647. sizeof( LLC_DLC_REALLOCATE_PARMS )},
  648. {sizeof( NT_DLC_READ_INPUT) + sizeof( LLC_CCB ), // READ2
  649. sizeof( NT_DLC_READ_PARMS) + sizeof( LLC_CCB )},
  650. {sizeof( LLC_RECEIVE_PARMS) + sizeof( LLC_CCB ), // RECEIVE2
  651. sizeof( NT_DLC_CCB_OUTPUT )},
  652. {sizeof( NT_DLC_TRANSMIT_PARMS ) + sizeof( LLC_CCB ), // TRANSMIT2
  653. sizeof( NT_DLC_CCB_OUTPUT )},
  654. {sizeof( NT_DLC_COMPLETE_COMMAND_PARMS ), // DLC.COMPLETE.COMMAND
  655. 0},
  656. // {sizeof( LLC_TRACE_INITIALIZE_PARMS ) + sizeof( LLC_CCB ),
  657. // 0},
  658. // {0, 0}
  659. // {sizeof( NT_NDIS_REQUEST_PARMS ),
  660. // sizeof( NT_NDIS_REQUEST_PARMS )}
  661. };
  662. #else
  663. extern LLC_IOCTL_BUFFERS aDlcIoBuffers[];
  664. #endif
  665. //
  666. // All NT DLC API parameters in one structure
  667. //
  668. typedef union _NT_DLC_PARMS {
  669. NT_DLC_BUFFER_FREE_ALLOCATION BufferFree;
  670. LLC_BUFFER_GET_PARMS BufferGet;
  671. LLC_BUFFER_CREATE_PARMS BufferCreate;
  672. NT_DLC_FLOW_CONTROL_PARMS DlcFlowControl;
  673. NT_DLC_OPEN_STATION_PARMS DlcOpenStation;
  674. NT_DLC_SET_INFORMATION_PARMS DlcSetInformation;
  675. NT_DLC_QUERY_INFORMATION_PARMS DlcGetInformation;
  676. NT_DLC_OPEN_SAP_PARMS DlcOpenSap;
  677. LLC_DIR_SET_EFLAG_PARMS DirSetExceptionFlags;
  678. NT_DLC_CANCEL_COMMAND_PARMS DlcCancelCommand;
  679. NT_DLC_RECEIVE_CANCEL_PARMS ReceiveCancel;
  680. USHORT StationId;
  681. NT_DLC_COMPLETE_COMMAND_PARMS CompleteCommand;
  682. LLC_DLC_REALLOCATE_PARMS DlcReallocate;
  683. LLC_DIR_OPEN_DIRECT_PARMS DirOpenDirect;
  684. NT_DIR_OPEN_ADAPTER_PARMS DirOpenAdapter;
  685. // NT_NDIS_REQUEST_PARMS NdisRequest;
  686. LLC_DLC_STATISTICS_PARMS DlcStatistics;
  687. LLC_ADAPTER_DLC_INFO DlcAdapter;
  688. WCHAR UnicodePath[MAX_PATH];
  689. //
  690. // At least DirTimerCancelGroup:
  691. //
  692. NT_DLC_CCB_INPUT InputCcb;
  693. //
  694. // Asynchronous parameters
  695. //
  696. //close sap/link/direct,reset, DirTimerSet;
  697. struct _ASYNC_DLC_PARMS {
  698. NT_DLC_CCB Ccb;
  699. union {
  700. UCHAR ByteBuffer[512];
  701. NT_DLC_CONNECT_STATION_PARMS DlcConnectStation;
  702. NT_DLC_READ_INPUT ReadInput;
  703. NT_DLC_READ_PARMS Read;
  704. LLC_RECEIVE_PARMS Receive;
  705. NT_DLC_TRANSMIT_ALLOCATION Transmit;
  706. // NT_NDIS_REQUEST_PARMS NdisRequest;
  707. LLC_TRACE_INITIALIZE_PARMS TraceInitialize;
  708. } Parms;
  709. } Async;
  710. } NT_DLC_PARMS, *PNT_DLC_PARMS;
  711. LLC_STATUS
  712. DlcCallDriver(
  713. IN UINT AdapterNumber,
  714. IN UINT IoctlCommand,
  715. IN PVOID pInputBuffer,
  716. IN UINT InputBufferLength,
  717. OUT PVOID pOutputBuffer,
  718. IN UINT OutputBufferLength
  719. );
  720. LLC_STATUS
  721. NtAcsLan(
  722. IN PLLC_CCB pCCB,
  723. IN PVOID pOrginalCcbAddress,
  724. OUT PLLC_CCB pOutputCcb,
  725. IN HANDLE EventHandle OPTIONAL
  726. );