Source code of Windows XP (NT5)
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.

733 lines
17 KiB

  1. /*
  2. Copyright (c) 1998 Microsoft Corporation
  3. Module Name:
  4. tcp.h
  5. Abstract:
  6. This module contains definitions, declarations relevant to AFP/TCP
  7. Author:
  8. Shirish Koti
  9. Revision History:
  10. 22 Jan 1998 Initial Version
  11. --*/
  12. #ifndef _TCP_
  13. #define _TCP_
  14. #define INVALID_HANDLE_VALUE ((HANDLE)(-1))
  15. #define AFP_TCP_BINDNAME L"\\Device\\Tcp"
  16. #define AFP_TCP_PORT 548
  17. #define DSI_ADAPTER_SIGNATURE *(DWORD *)"TADP"
  18. #define DSI_CONN_SIGNATURE *(DWORD *)"TCON"
  19. #define DSI_REQUEST_SIGNATURE *(DWORD *)"DREQ"
  20. // number of connections on the free list
  21. #define DSI_INIT_FREECONNLIST_SIZE 10
  22. typedef ULONG IPADDRESS;
  23. // let's not send more than 10 ipaddresses to the Mac
  24. #define DSI_MAX_IPADDR_COUNT 10
  25. #define DSI_NETWORK_ADDR_LEN 6
  26. #define DSI_NETWORK_ADDR_IPTAG 0x01
  27. #define ATALK_NETWORK_ADDR_LEN 6
  28. #define ATALK_NETWORK_ADDR_ATKTAG 0x03
  29. #define DSI_HEADER_SIZE 16
  30. #define DSI_TICKLE_TIMER 30 // every 30 seconds, see who needs a tickle
  31. #define DSI_TICKLE_TIME_LIMIT 30 // if 30+ seconds since we last heard, send tickle
  32. // the only DSI packets (i.e. packets that originate from the DSI layer) are
  33. // for DsiOpenSession, DsiCloseSession and DsiTickle. DsiOpenSession is the
  34. // largest of these because it has the 6 bytes of options. The spec says that
  35. // this is a variable length field, but it only has given one option (Server
  36. // Request Quantum) that the server can send. If more options are ever defined,
  37. // this define will have to change. For now, only 6 additional bytes
  38. //
  39. #define DSI_MAX_DSI_OPTION_LEN 6
  40. #define DSI_OPENSESS_OPTION_LEN 4
  41. #define DSI_OPTION_FIXED_LEN 2
  42. #define DSI_MAX_DSI_PKT_SIZE (DSI_HEADER_SIZE + DSI_MAX_DSI_OPTION_LEN)
  43. // round off to dword-align
  44. #define DSI_BUFF_SIZE ((DSI_MAX_DSI_PKT_SIZE) + (4 - (DSI_MAX_DSI_PKT_SIZE%4)))
  45. //
  46. // the htonX macros 'lifted' from sockets\netinet\in.h
  47. //
  48. #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
  49. #define htons(x) _byteswap_ushort((USHORT)(x))
  50. #define htonl(x) _byteswap_ulong((ULONG)(x))
  51. #else
  52. #define htons(x) ((((x) >> 8) & 0x00FF) | (((x) << 8) & 0xFF00))
  53. #define htonl(x) ((((x) >> 24) & 0x000000FFL) | \
  54. (((x) >> 8) & 0x0000FF00L) | \
  55. (((x) << 8) & 0x00FF0000L) | \
  56. (((x) << 24) & 0xFF000000L))
  57. #endif
  58. #define ntohs(x) htons(x)
  59. #define ntohl(x) htonl(x)
  60. typedef NTSTATUS (FASTCALL *DSI_WORKER)(IN PVOID Context);
  61. typedef struct _IpAddrEntity
  62. {
  63. LIST_ENTRY Linkage;
  64. IPADDRESS IpAddress;
  65. } IPADDRENTITY, *PIPADDRENTITY;
  66. typedef struct _TcpAdptr
  67. {
  68. DWORD adp_Signature;
  69. DWORD adp_RefCount;
  70. DWORD adp_State;
  71. LIST_ENTRY adp_ActiveConnHead;
  72. LIST_ENTRY adp_FreeConnHead;
  73. DWORD adp_NumFreeConnections;
  74. AFP_SPIN_LOCK adp_SpinLock;
  75. HANDLE adp_FileHandle;
  76. PFILE_OBJECT adp_pFileObject;
  77. } TCPADPTR, *PTCPADPTR;
  78. // values for the adp_State field of TCPADPTR
  79. #define TCPADPTR_STATE_INIT 0x1
  80. #define TCPADPTR_STATE_BOUND 0x2
  81. #define TCPADPTR_STATE_CLOSING 0x4
  82. #define TCPADPTR_STATE_CLEANED_UP 0x8
  83. //
  84. // the DSI Commands
  85. //
  86. #define DSI_COMMAND_CLOSESESSION 1
  87. #define DSI_COMMAND_COMMAND 2
  88. #define DSI_COMMAND_GETSTATUS 3
  89. #define DSI_COMMAND_OPENSESSION 4
  90. #define DSI_COMMAND_TICKLE 5
  91. #define DSI_COMMAND_WRITE 6
  92. #define DSI_COMMAND_ATTENTION 8
  93. //
  94. // call-ins into AFP
  95. //
  96. #define AfpCB_SessionNotify AfpSdaCreateNewSession
  97. #define AfpCB_RequestNotify afpSpHandleRequest
  98. #define AfpCB_GetWriteBuffer AfpGetWriteBuffer
  99. #define AfpCB_ReplyCompletion afpSpReplyComplete
  100. #define AfpCB_AttnCompletion afpSpAttentionComplete
  101. #define AfpCB_CloseCompletion afpSpCloseComplete
  102. typedef struct _DsiReq
  103. {
  104. LIST_ENTRY dsi_Linkage;
  105. DWORD dsi_Signature;
  106. struct _TcpConn *dsi_pTcpConn; // the connection that this req belongs to
  107. REQUEST dsi_AfpRequest; // the request structure for AFP's use
  108. DWORD dsi_RequestLen; // how many bytes in the DSI command
  109. DWORD dsi_WriteLen; // total bytes to write (only in DSIWrite)
  110. USHORT dsi_RequestID; // what's the request ID
  111. BYTE dsi_Command; // what command is it
  112. BYTE dsi_Flags; // is this a request or a response?
  113. PBYTE dsi_PartialBuf; // buffer, in case partial data arrives
  114. DWORD dsi_PartialBufSize; // number of bytes in the partial buffer
  115. DWORD dsi_PartialWriteSize; // number of bytes of the Write got so far
  116. PMDL dsi_pDsiAllocedMdl; // our mdl, if afp doesn't give us one
  117. PVOID dsi_AttnContext; // afp's context for SendAttention
  118. BYTE dsi_RespHeader[DSI_BUFF_SIZE]; // header during response
  119. } DSIREQ, *PDSIREQ;
  120. typedef struct _TcpConn
  121. {
  122. LIST_ENTRY con_Linkage;
  123. DWORD con_Signature;
  124. PTCPADPTR con_pTcpAdptr;
  125. DWORD con_RefCount;
  126. USHORT con_State;
  127. USHORT con_RcvState;
  128. DWORD con_BytesWithTcp;
  129. DWORD con_LastHeard;
  130. IPADDRESS con_DestIpAddr;
  131. PDSIREQ con_pDsiReq;
  132. LIST_ENTRY con_PendingReqs;
  133. PSDA con_pSda;
  134. PIRP con_pRcvIrp;
  135. DWORD con_MaxAttnPktSize;
  136. USHORT con_OutgoingReqId;
  137. USHORT con_NextReqIdToRcv;
  138. HANDLE con_FileHandle;
  139. PFILE_OBJECT con_pFileObject;
  140. AFP_SPIN_LOCK con_SpinLock;
  141. } TCPCONN, *PTCPCONN;
  142. // values for the con_State field of TCPCONN
  143. #define TCPCONN_STATE_INIT 0x001
  144. #define TCPCONN_STATE_CONNECTED 0x002
  145. #define TCPCONN_STATE_AFP_ATTACHED 0x004
  146. #define TCPCONN_STATE_NOTIFY_AFP 0x008
  147. #define TCPCONN_STATE_NOTIFY_TCP 0x010
  148. #define TCPCONN_STATE_PARTIAL_DATA 0x020
  149. #define TCPCONN_STATE_TCP_HAS_IRP 0x040
  150. #define TCPCONN_STATE_TICKLES_STOPPED 0x080
  151. #define TCPCONN_STATE_CLOSING 0x100
  152. #define TCPCONN_STATE_ABORTIVE_DISCONNECT 0x200
  153. #define TCPCONN_STATE_RCVD_REMOTE_CLOSE 0x400
  154. #define TCPCONN_STATE_CLEANED_UP 0x800
  155. // values for con_RcvState field of TCPCONN
  156. #define DSI_NEW_REQUEST 0 // waiting for new request
  157. #define DSI_PARTIAL_HEADER 1 // got 1 or more but, less than 16 bytes of hdr
  158. #define DSI_HDR_COMPLETE 2 // got full header, but 0 data
  159. #define DSI_PARTIAL_COMMAND 3 // got full hdr, and part of data
  160. #define DSI_COMMAND_COMPLETE 4 // got hdr and all the data with it
  161. #define DSI_AWAITING_WRITE_MDL 5 // awaiting write mdl from afp server
  162. #define DSI_PARTIAL_WRITE 6 // write command in progress
  163. #define DSI_WRITE_COMPLETE 7 // all write bytes are in
  164. #define DSI_REQUEST 0
  165. #define DSI_REPLY 1
  166. #define DSI_OFFSET_FLAGS 0
  167. #define DSI_OFFSET_COMMAND 1
  168. #define DSI_OFFSET_REQUESTID 2
  169. #define DSI_OFFSET_DATAOFFSET 4
  170. #define DSI_OFFSET_ERROROFFSET 4
  171. #define DSI_OFFSET_DATALEN 8
  172. #define DSI_OFFSET_RESERVED 12
  173. #define DSI_OFFSET_OPTION_TYPE 0
  174. #define DSI_OFFSET_OPTION_LENGTH 1
  175. #define DSI_OFFSET_OPTION_OPTION 2
  176. #define DSI_OPTION_SRVREQ_QUANTUM 0
  177. #define DSI_SERVER_REQUEST_QUANTUM 65535
  178. //
  179. // get the relevant info from the DSI header. If it's a Write
  180. // request, the Enclosed Data Offset field contains how big the
  181. // request part is. The Total Data Length field contains how many
  182. // bytes follow the DSI header. The difference between the two
  183. // is the size of the Write.
  184. //
  185. #define DSI_PARSE_HEADER(_pDsiReq, _Buffer) \
  186. { \
  187. (_pDsiReq)->dsi_Flags = (_Buffer)[DSI_OFFSET_FLAGS]; \
  188. (_pDsiReq)->dsi_Command = (_Buffer)[DSI_OFFSET_COMMAND]; \
  189. \
  190. GETSHORT2SHORT((&((_pDsiReq)->dsi_RequestID)), \
  191. (&(_Buffer)[DSI_OFFSET_REQUESTID])); \
  192. \
  193. if ((_pDsiReq)->dsi_Command == DSI_COMMAND_WRITE) \
  194. { \
  195. GETDWORD2DWORD((&((_pDsiReq)->dsi_RequestLen)), \
  196. (&(_Buffer)[DSI_OFFSET_DATAOFFSET])); \
  197. \
  198. GETDWORD2DWORD((&((_pDsiReq)->dsi_WriteLen)), \
  199. (&(_Buffer)[DSI_OFFSET_DATALEN])); \
  200. \
  201. (_pDsiReq)->dsi_WriteLen -= (_pDsiReq)->dsi_RequestLen; \
  202. } \
  203. else \
  204. { \
  205. GETDWORD2DWORD((&((_pDsiReq)->dsi_RequestLen)), \
  206. (&(_Buffer)[DSI_OFFSET_DATALEN])); \
  207. } \
  208. }
  209. typedef struct _DsiHeader
  210. {
  211. BYTE Flags;
  212. BYTE Command;
  213. USHORT RequestID;
  214. DWORD DataOffset;
  215. DWORD TotalLength;
  216. DWORD Reserved;
  217. } DSIHEADER, *PDSIHEADER;
  218. typedef struct _TcpWorkItem
  219. {
  220. WORK_ITEM tcp_WorkItem;
  221. DSI_WORKER tcp_Worker;
  222. PVOID tcp_Context;
  223. } TCPWORKITEM, *PTCPWORKITEM;
  224. #define VALID_TCPCONN(_pTcpConn) \
  225. ((_pTcpConn->con_Signature == DSI_CONN_SIGNATURE) && \
  226. (_pTcpConn->con_RefCount > 0 && _pTcpConn->con_RefCount < 5000)) \
  227. #define DsiTerminateConnection(pTcpConn) \
  228. DsiKillConnection(pTcpConn, 0)
  229. #define DsiAbortConnection(pTcpConn) \
  230. DsiKillConnection(pTcpConn, TDI_DISCONNECT_ABORT)
  231. //
  232. // the globals
  233. //
  234. GLOBAL PTCPADPTR DsiTcpAdapter EQU NULL;
  235. GLOBAL AFP_SPIN_LOCK DsiAddressLock;
  236. GLOBAL LIST_ENTRY DsiIpAddrList;
  237. GLOBAL PBYTE DsiStatusBuffer EQU NULL;
  238. GLOBAL DWORD DsiStatusBufferSize EQU 0;
  239. GLOBAL BOOLEAN DsiTcpEnabled EQU TRUE;
  240. GLOBAL AFP_SPIN_LOCK DsiResourceLock;
  241. GLOBAL LIST_ENTRY DsiFreeRequestList;
  242. GLOBAL DWORD DsiFreeRequestListSize EQU 0;
  243. GLOBAL DWORD DsiNumTcpConnections EQU 0;
  244. GLOBAL KEVENT DsiShutdownEvent EQU {0};
  245. //
  246. // prototypes for functions in dsi.c
  247. //
  248. NTSTATUS
  249. DsiAfpSetStatus(
  250. IN PVOID Context,
  251. IN PUCHAR pStatusBuf,
  252. IN USHORT StsBufSize
  253. );
  254. NTSTATUS
  255. DsiAfpCloseConn(
  256. IN PTCPCONN pTcpConn
  257. );
  258. NTSTATUS
  259. DsiAfpFreeConn(
  260. IN PTCPCONN pTcpConn
  261. );
  262. NTSTATUS FASTCALL
  263. DsiAfpListenControl(
  264. IN PVOID Context,
  265. IN BOOLEAN Enable
  266. );
  267. NTSTATUS FASTCALL
  268. DsiAfpWriteContinue(
  269. IN PREQUEST pRequest
  270. );
  271. NTSTATUS FASTCALL
  272. DsiAfpReply(
  273. IN PREQUEST pRequest,
  274. IN PBYTE pResultCode
  275. );
  276. NTSTATUS
  277. DsiAfpSendAttention(
  278. IN PTCPCONN pTcpConn,
  279. IN USHORT AttentionWord,
  280. IN PVOID pContext
  281. );
  282. NTSTATUS
  283. DsiAcceptConnection(
  284. IN PTCPADPTR pTcpAdptr,
  285. IN IPADDRESS MacIpAddr,
  286. OUT PTCPCONN *ppRetTcpConn
  287. );
  288. NTSTATUS
  289. DsiProcessData(
  290. IN PTCPCONN pTcpConn,
  291. IN ULONG BytesIndicated,
  292. IN ULONG BytesAvailable,
  293. IN PBYTE pDsiData,
  294. OUT PULONG pBytesAccepted,
  295. OUT PIRP *ppRetIrp
  296. );
  297. BOOLEAN
  298. DsiValidateHeader(
  299. IN PTCPCONN pTcpConn,
  300. IN PDSIREQ pDsiReq
  301. );
  302. NTSTATUS
  303. DsiAfpReplyCompletion(
  304. IN PDEVICE_OBJECT DeviceObject,
  305. IN PIRP pIrp,
  306. IN PVOID pContext
  307. );
  308. NTSTATUS
  309. DsiAcceptConnectionCompletion(
  310. IN PDEVICE_OBJECT DeviceObject,
  311. IN PIRP pIrp,
  312. IN PVOID Context
  313. );
  314. BOOLEAN
  315. DsiKillConnection(
  316. IN PTCPCONN pTcpConn,
  317. IN DWORD DiscFlag
  318. );
  319. NTSTATUS
  320. DsiDisconnectWithTcp(
  321. IN PTCPCONN pTcpConn,
  322. IN DWORD DiscFlag
  323. );
  324. NTSTATUS
  325. DsiDisconnectWithAfp(
  326. IN PTCPCONN pTcpConn,
  327. IN NTSTATUS Reason
  328. );
  329. NTSTATUS
  330. DsiTcpDisconnectCompletion(
  331. IN PDEVICE_OBJECT DeviceObject,
  332. IN PIRP pIrp,
  333. IN PVOID Context
  334. );
  335. NTSTATUS
  336. DsiTcpRcvIrpCompletion(
  337. IN PDEVICE_OBJECT Unused,
  338. IN PIRP pIrp,
  339. IN PVOID pContext
  340. );
  341. NTSTATUS
  342. DsiExecuteCommand(
  343. IN PTCPCONN pTcpConn,
  344. IN PDSIREQ pDsiReq
  345. );
  346. NTSTATUS
  347. DsiOpenSession(
  348. IN PTCPCONN pTcpConn,
  349. IN PDSIREQ pDsiReq
  350. );
  351. NTSTATUS
  352. DsiSendDsiRequest(
  353. IN PTCPCONN pTcpConn,
  354. IN DWORD DataLen,
  355. IN USHORT AttentionWord,
  356. IN PVOID AttentionContext,
  357. IN BYTE Command
  358. );
  359. NTSTATUS
  360. DsiSendDsiReply(
  361. IN PTCPCONN pTcpConn,
  362. IN PDSIREQ pDsiReq,
  363. IN NTSTATUS OpStatus
  364. );
  365. NTSTATUS
  366. DsiSendStatus(
  367. IN PTCPCONN pTcpConn,
  368. IN PDSIREQ pDsiReq
  369. );
  370. AFPSTATUS FASTCALL
  371. DsiSendTickles(
  372. IN PVOID pUnUsed
  373. );
  374. NTSTATUS
  375. DsiSendCompletion(
  376. IN PDEVICE_OBJECT DeviceObject,
  377. IN PIRP pIrp,
  378. IN PVOID pContext
  379. );
  380. //
  381. // prototypes for functions in tcptdi.c
  382. //
  383. NTSTATUS
  384. DsiOpenTdiAddress(
  385. IN PTCPADPTR pTcpAdptr,
  386. OUT PHANDLE pRetFileHandle,
  387. OUT PFILE_OBJECT *ppRetFileObj
  388. );
  389. NTSTATUS
  390. DsiOpenTdiConnection(
  391. IN PTCPCONN pTcpConn
  392. );
  393. NTSTATUS
  394. DsiAssociateTdiConnection(
  395. IN PTCPCONN pTcpConn
  396. );
  397. NTSTATUS
  398. DsiSetEventHandler(
  399. IN PDEVICE_OBJECT pDeviceObject,
  400. IN PFILE_OBJECT pFileObject,
  401. IN ULONG EventType,
  402. IN PVOID EventHandler,
  403. IN PVOID Context
  404. );
  405. NTSTATUS
  406. DsiTdiSynchronousIrp(
  407. IN PIRP pIrp,
  408. PDEVICE_OBJECT pDeviceObject
  409. );
  410. NTSTATUS
  411. DsiTdiCompletionRoutine(
  412. IN PDEVICE_OBJECT DeviceObject,
  413. IN PIRP Irp,
  414. IN PVOID Context
  415. );
  416. NTSTATUS
  417. DsiTdiSend(
  418. IN PTCPCONN pTcpConn,
  419. IN PMDL pMdl,
  420. IN DWORD DataLen,
  421. IN PVOID pCompletionRoutine,
  422. IN PVOID pContext
  423. );
  424. VOID
  425. DsiIpAddressCameIn(
  426. IN PTA_ADDRESS Address,
  427. IN PUNICODE_STRING DeviceName,
  428. IN PTDI_PNP_CONTEXT Context2
  429. );
  430. VOID
  431. DsiIpAddressWentAway(
  432. IN PTA_ADDRESS Address,
  433. IN PUNICODE_STRING DeviceName,
  434. IN PTDI_PNP_CONTEXT Context2
  435. );
  436. NTSTATUS
  437. DsiTdiConnectHandler(
  438. IN PVOID EventContext,
  439. IN int MacIpAddrLen,
  440. IN PVOID pSrcAddress,
  441. IN int DsiDataLength,
  442. IN PVOID pDsiData,
  443. IN int OptionsLength,
  444. IN PVOID pOptions,
  445. OUT CONNECTION_CONTEXT *pOurConnContext,
  446. OUT PIRP *ppOurAcceptIrp
  447. );
  448. NTSTATUS
  449. DsiTdiReceiveHandler(
  450. IN PVOID EventContext,
  451. IN PVOID ConnectionContext,
  452. IN USHORT RcvFlags,
  453. IN ULONG BytesIndicated,
  454. IN ULONG BytesAvailable,
  455. OUT PULONG pBytesAccepted,
  456. IN PVOID pDsiData,
  457. OUT PIRP *ppIrp
  458. );
  459. NTSTATUS
  460. DsiTdiDisconnectHandler(
  461. IN PVOID EventContext,
  462. IN PVOID ConnectionContext,
  463. IN ULONG DisconnectDataLength,
  464. IN PVOID pDisconnectData,
  465. IN ULONG DisconnectInformationLength,
  466. IN PVOID pDisconnectInformation,
  467. IN ULONG DisconnectIndicators
  468. );
  469. NTSTATUS
  470. DsiTdiErrorHandler(
  471. IN PVOID EventContext,
  472. IN NTSTATUS Status
  473. );
  474. NTSTATUS
  475. DsiCloseTdiAddress(
  476. IN PTCPADPTR pTcpAdptr
  477. );
  478. NTSTATUS
  479. DsiCloseTdiConnection(
  480. IN PTCPCONN pTcpConn
  481. );
  482. //
  483. // prototypes for functions in tcputil.c
  484. //
  485. VOID
  486. DsiInit(
  487. IN VOID
  488. );
  489. NTSTATUS FASTCALL
  490. DsiCreateAdapter(
  491. IN VOID
  492. );
  493. BOOLEAN
  494. IsThisOnAppletalksDefAdapter(
  495. IN PUNICODE_STRING pBindDeviceName
  496. );
  497. NTSTATUS FASTCALL
  498. DsiCreateTcpConn(
  499. IN PTCPADPTR pTcpAdptr
  500. );
  501. NTSTATUS
  502. DsiAddIpaddressToList(
  503. IN IPADDRESS IpAddress
  504. );
  505. BOOLEAN
  506. DsiRemoveIpaddressFromList(
  507. IN IPADDRESS IpAddress
  508. );
  509. PDSIREQ
  510. DsiGetRequest(
  511. IN VOID
  512. );
  513. PBYTE
  514. DsiGetReqBuffer(
  515. IN DWORD BufLen
  516. );
  517. VOID
  518. DsiFreeRequest(
  519. PDSIREQ pDsiReq
  520. );
  521. VOID
  522. DsiFreeReqBuffer(
  523. IN PBYTE pBuffer
  524. );
  525. VOID
  526. DsiDereferenceAdapter(
  527. IN PTCPADPTR pTcpAdptr
  528. );
  529. VOID
  530. DsiDereferenceConnection(
  531. IN PTCPCONN pTcpConn
  532. );
  533. NTSTATUS
  534. DsiDestroyAdapter(
  535. IN VOID
  536. );
  537. NTSTATUS FASTCALL
  538. DsiFreeAdapter(
  539. IN PTCPADPTR pTcpAdptr
  540. );
  541. NTSTATUS FASTCALL
  542. DsiFreeConnection(
  543. IN PTCPCONN pTcpConn
  544. );
  545. NTSTATUS
  546. DsiGetIpAddrBlob(
  547. IN DWORD *pIpAddrCount,
  548. IN PBYTE *ppIpAddrBlob
  549. );
  550. PIRP
  551. DsiGetIrpForTcp(
  552. IN PTCPCONN pTcpConn,
  553. IN PBYTE pBuffer,
  554. IN PMDL pInputMdl,
  555. IN DWORD ReadSize
  556. );
  557. PMDL
  558. DsiMakePartialMdl(
  559. IN PMDL pOrgMdl,
  560. IN DWORD dwOffset
  561. );
  562. NTSTATUS FASTCALL
  563. DsiUpdateAfpStatus(
  564. IN PVOID Unused
  565. );
  566. NTSTATUS
  567. DsiScheduleWorkerEvent(
  568. IN DSI_WORKER WorkerRoutine,
  569. IN PVOID Context
  570. );
  571. VOID FASTCALL
  572. DsiWorker(
  573. IN PVOID Context
  574. );
  575. PTCPADPTR
  576. DsiRefAdptrByBindName(
  577. IN PUNICODE_STRING pBindDeviceName
  578. );
  579. VOID
  580. DsiShutdown(
  581. IN VOID
  582. );
  583. #endif