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.

457 lines
13 KiB

  1. /*++
  2. Copyright (c) 1998-2000 Microsoft Corporation
  3. Module Name:
  4. drdev
  5. Abstract:
  6. This module defines the parent for the client-side RDP
  7. device redirection "device" class hierarchy, DrDevice.
  8. Author:
  9. Tad Brockway 3/23/99
  10. Revision History:
  11. --*/
  12. #ifndef __DRDEV_H__
  13. #define __DRDEV_H__
  14. #include <rdpdr.h>
  15. #include "drobject.h"
  16. #include "drobjmgr.h"
  17. ///////////////////////////////////////////////////////////////
  18. //
  19. // Defines and Macros
  20. //
  21. //
  22. // Maximum length of a device trace message, not including the
  23. // NULL terminator.
  24. //
  25. #define RDP_MAX_DEVICE_TRACE_LEN 256
  26. ///////////////////////////////////////////////////////////////
  27. //
  28. // Device change state
  29. // New means it's not sent to server yet
  30. // Remove means it needs to be removed from server
  31. // Exist means the server has it
  32. typedef enum tagDEVICECHANGE {
  33. DEVICENEW = 0,
  34. DEVICEREMOVE,
  35. DEVICEANNOUCED
  36. } DEVICECHANGE;
  37. ///////////////////////////////////////////////////////////////
  38. //
  39. // DeviceProperty Class Declaration
  40. //
  41. class DrDevice;
  42. class DrDevProperty : public DrObject
  43. {
  44. protected:
  45. BOOL _bSeekable;
  46. friend class DrDevice;
  47. public:
  48. DrDevProperty() {
  49. _bSeekable = FALSE;
  50. }
  51. virtual ~DrDevProperty() { /* do nothing for now. */ }
  52. //
  53. // Setup seekable property
  54. //
  55. void SetSeekProperty(BOOL bSeekable) {
  56. _bSeekable = bSeekable;
  57. }
  58. //
  59. // Return the class name.
  60. //
  61. virtual DRSTRING ClassName() { return TEXT("DrDevProperty"); }
  62. };
  63. ///////////////////////////////////////////////////////////////
  64. //
  65. // DrDevice Class Declaration
  66. //
  67. //
  68. class ProcObj;
  69. class DrDevice : public DrObject
  70. {
  71. protected:
  72. ULONG _deviceID;
  73. DrDevProperty _deviceProperty;
  74. ProcObj *_processObject;
  75. //
  76. // List of all opening files associated with the device
  77. // being redirected.
  78. //
  79. DrFileMgr *_FileMgr;
  80. //
  81. // Setup device property
  82. //
  83. virtual VOID SetDeviceProperty() { /* do nothing, take default */ }
  84. //
  85. // Default IO Request Handling.
  86. //
  87. virtual VOID DefaultIORequestMsgHandle(
  88. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  89. IN NTSTATUS serverReturnStatus
  90. );
  91. //
  92. // IO Processing Functions
  93. //
  94. // These are the functions that need to be implemented
  95. // in subclasses. Here are the args:
  96. //
  97. // pIoRequestPacket - Request packet received from server.
  98. // packetLen - Length of the packet
  99. //
  100. virtual VOID MsgIrpCreate(
  101. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  102. UINT32 packetLen
  103. );
  104. virtual VOID MsgIrpCleanup(
  105. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  106. UINT32 packetLen
  107. );
  108. virtual VOID MsgIrpClose(
  109. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  110. UINT32 packetLen
  111. );
  112. virtual VOID MsgIrpRead(
  113. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  114. UINT32 packetLen
  115. );
  116. virtual VOID MsgIrpWrite(
  117. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  118. UINT32 packetLen
  119. );
  120. virtual VOID MsgIrpFlushBuffers(
  121. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  122. UINT32 packetLen
  123. );
  124. virtual VOID MsgIrpShutdown(
  125. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  126. UINT32 packetLen
  127. );
  128. virtual VOID MsgIrpDeviceControl(
  129. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  130. UINT32 packetLen
  131. );
  132. virtual VOID MsgIrpLockControl(
  133. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  134. UINT32 packetLen
  135. );
  136. virtual VOID MsgIrpInternalDeviceControl(
  137. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  138. UINT32 packetLen
  139. );
  140. virtual VOID MsgIrpDirectoryControl(
  141. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  142. UINT32 packetLen
  143. );
  144. virtual VOID MsgIrpQueryVolumeInfo(
  145. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  146. UINT32 packetLen
  147. );
  148. virtual VOID MsgIrpSetVolumeInfo(
  149. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  150. UINT32 packetLen
  151. );
  152. virtual VOID MsgIrpQueryFileInfo(
  153. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  154. UINT32 packetLen
  155. );
  156. virtual VOID MsgIrpSetFileInfo(
  157. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  158. UINT32 packetLen
  159. );
  160. virtual VOID MsgIrpQuerySdInfo(
  161. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  162. UINT32 packetLen
  163. );
  164. virtual VOID MsgIrpSetSdInfo(
  165. PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  166. UINT32 packetLen
  167. );
  168. public:
  169. DEVICECHANGE _deviceChange;
  170. //
  171. // Constructor/Destructor
  172. //
  173. DrDevice(ProcObj *processObject, ULONG deviceID);
  174. virtual ~DrDevice();
  175. //
  176. // Initialize
  177. //
  178. virtual DWORD Initialize();
  179. //
  180. // Get basic information about the device.
  181. //
  182. virtual DRSTRING GetName() = 0;
  183. virtual ULONG GetID() {
  184. return _deviceID;
  185. }
  186. virtual BOOL IsSeekableDevice() {
  187. return _deviceProperty._bSeekable;
  188. }
  189. //
  190. // Get the device type. See "Device Types" section of rdpdr.h
  191. //
  192. virtual ULONG GetDeviceType() = 0;
  193. //
  194. // Device Data Information
  195. //
  196. virtual ULONG GetDevAnnounceDataSize() = 0;
  197. virtual VOID GetDevAnnounceData(IN PRDPDR_DEVICE_ANNOUNCE buf) = 0;
  198. //
  199. // Return the "parent" TS Device Redirection IO processing object.
  200. //
  201. virtual ProcObj *ProcessObject() { return _processObject; }
  202. //
  203. // Handle an IO request from the server.
  204. //
  205. virtual VOID ProcessIORequest(IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket, IN UINT32 packetLen);
  206. //
  207. // Return the class name.
  208. //
  209. virtual DRSTRING ClassName() { return TEXT("DrDevice"); }
  210. //
  211. // Flush outstanding IRPs
  212. //
  213. virtual VOID FlushIRPs() { return; };
  214. };
  215. ///////////////////////////////////////////////////////////////
  216. //
  217. // DrDevice Inline Functions
  218. //
  219. //
  220. //
  221. // IO Processing Functions
  222. //
  223. // These are the functions that need to be implemented
  224. // in subclasses. Here are the args:
  225. //
  226. // pIoRequestPacket - Request packet received from server.
  227. // packetLen - Length of the packet
  228. //
  229. inline VOID DrDevice::MsgIrpCreate(
  230. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  231. IN UINT32 packetLen
  232. ) {
  233. DC_BEGIN_FN("DrDevice::MsgIrpCreate");
  234. ASSERT(FALSE);
  235. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  236. DC_END_FN();
  237. }
  238. inline VOID DrDevice::MsgIrpCleanup(
  239. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  240. IN UINT32 packetLen
  241. ){
  242. DC_BEGIN_FN("DrDevice::MsgIrpCleanup");
  243. ASSERT(FALSE);
  244. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  245. DC_END_FN();
  246. }
  247. inline VOID DrDevice::MsgIrpClose(
  248. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  249. IN UINT32 packetLen
  250. ){
  251. DC_BEGIN_FN("DrDevice::MsgIrpClose");
  252. ASSERT(FALSE);
  253. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  254. DC_END_FN();
  255. }
  256. inline VOID DrDevice::MsgIrpRead(
  257. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  258. IN UINT32 packetLen
  259. ){
  260. DC_BEGIN_FN("DrDevice::MsgIrpRead");
  261. ASSERT(FALSE);
  262. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  263. DC_END_FN();
  264. }
  265. inline VOID DrDevice::MsgIrpWrite(
  266. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  267. IN UINT32 packetLen
  268. ){
  269. DC_BEGIN_FN("DrDevice::MsgIrpWrite");
  270. ASSERT(FALSE);
  271. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  272. DC_END_FN();
  273. }
  274. inline VOID DrDevice::MsgIrpFlushBuffers(
  275. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  276. IN UINT32 packetLen
  277. ){
  278. DC_BEGIN_FN("DrDevice::MsgIrpFlushBuffers");
  279. ASSERT(FALSE);
  280. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  281. DC_END_FN();
  282. }
  283. inline VOID DrDevice::MsgIrpShutdown(
  284. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  285. IN UINT32 packetLen
  286. ){
  287. DC_BEGIN_FN("DrDevice::MsgIrpShutdown");
  288. ASSERT(FALSE);
  289. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  290. DC_END_FN();
  291. }
  292. inline VOID DrDevice::MsgIrpDeviceControl(
  293. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  294. IN UINT32 packetLen
  295. ){
  296. DC_BEGIN_FN("DrDevice::MsgIrpDeviceControl");
  297. ASSERT(FALSE);
  298. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  299. DC_END_FN();
  300. };
  301. inline VOID DrDevice::MsgIrpLockControl(
  302. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  303. IN UINT32 packetLen
  304. ){
  305. DC_BEGIN_FN("DrDevice::MsgIrpLockControl");
  306. ASSERT(FALSE);
  307. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  308. DC_END_FN();
  309. };
  310. inline VOID DrDevice::MsgIrpInternalDeviceControl(
  311. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  312. IN UINT32 packetLen
  313. ){
  314. DC_BEGIN_FN("DrDevice::MsgIrpInternalDeviceControl");
  315. ASSERT(FALSE);
  316. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  317. DC_END_FN();
  318. };
  319. inline VOID DrDevice::MsgIrpDirectoryControl(
  320. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  321. IN UINT32 packetLen
  322. ){
  323. DC_BEGIN_FN("DrDevice::MsgIrpDirectoryControl");
  324. ASSERT(FALSE);
  325. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  326. DC_END_FN();
  327. };
  328. inline VOID DrDevice::MsgIrpQueryVolumeInfo(
  329. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  330. IN UINT32 packetLen
  331. ){
  332. DC_BEGIN_FN("DrDevice::MsgIrpQueryVolumeInfo");
  333. ASSERT(FALSE);
  334. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  335. DC_END_FN();
  336. };
  337. inline VOID DrDevice::MsgIrpSetVolumeInfo(
  338. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  339. IN UINT32 packetLen
  340. ){
  341. DC_BEGIN_FN("DrDevice::MsgIrpSetVolumeInfo");
  342. ASSERT(FALSE);
  343. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  344. DC_END_FN();
  345. };
  346. inline VOID DrDevice::MsgIrpQueryFileInfo(
  347. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  348. IN UINT32 packetLen
  349. ){
  350. DC_BEGIN_FN("DrDevice::MsgIrpQueryFileInfo");
  351. ASSERT(FALSE);
  352. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  353. DC_END_FN();
  354. };
  355. inline VOID DrDevice::MsgIrpSetFileInfo(
  356. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  357. IN UINT32 packetLen
  358. ){
  359. DC_BEGIN_FN("DrDevice::MsgIrpSetFileInfo");
  360. ASSERT(FALSE);
  361. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  362. DC_END_FN();
  363. };
  364. inline VOID DrDevice::MsgIrpQuerySdInfo(
  365. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  366. IN UINT32 packetLen
  367. ){
  368. DC_BEGIN_FN("DrDevice::MsgIrpQuerySdInfo");
  369. ASSERT(FALSE);
  370. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  371. DC_END_FN();
  372. };
  373. inline VOID DrDevice::MsgIrpSetSdInfo(
  374. IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
  375. IN UINT32 packetLen
  376. ){
  377. DC_BEGIN_FN("DrDevice::MsgIrpSetSdInfo");
  378. ASSERT(FALSE);
  379. DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
  380. DC_END_FN();
  381. };
  382. #endif