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.

244 lines
6.6 KiB

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4. tcontrol.c
  5. Abstract:
  6. Test for cluster resource and resource type controls
  7. Author:
  8. Rod Gamache (rodga) 30-Dec-1996
  9. Revision History:
  10. --*/
  11. #include "windows.h"
  12. #include "cluster.h"
  13. #include "stdio.h"
  14. #include "stdlib.h"
  15. #include "resapi.h"
  16. LPWSTR ClusterName=NULL;
  17. LPWSTR ResourceTypeName=NULL;
  18. LPWSTR NodeName=NULL;
  19. DWORD ControlCode=0xffffffff;
  20. DWORD Access=CLUS_ACCESS_READ;
  21. CHAR UsageText[] =
  22. "TCONTROL [-c cluster] -n node -r resourcetype -a access ControlCode\n"
  23. " cluster\tspecifies the name of the cluster to connect to\n"
  24. " node\tspecifies the node to direct the request to\n"
  25. " resource\tspecifies the name of the resource to control\n"
  26. " access\tspecifies the access to the resource type (read, write or any)\n"
  27. " ControlCode\ta number between 1 and 9\n";
  28. void
  29. Usage(
  30. void
  31. )
  32. {
  33. fprintf(stderr, UsageText);
  34. exit(1);
  35. }
  36. LPWSTR
  37. GetString(
  38. IN LPSTR String
  39. )
  40. {
  41. LPWSTR wString;
  42. DWORD Length;
  43. Length = strlen(String)+1;
  44. wString = malloc(Length*sizeof(WCHAR));
  45. if (wString == NULL) {
  46. fprintf(stderr, "GetString couldn't malloc %d bytes\n",Length*sizeof(WCHAR));
  47. }
  48. mbstowcs(wString, String, Length);
  49. return(wString);
  50. }
  51. void
  52. ParseArgs(
  53. int argc,
  54. char *argv[]
  55. )
  56. {
  57. int i;
  58. DWORD IntCount;
  59. DWORD Value;
  60. CHAR TestValue[16];
  61. PUCHAR ControlData;
  62. LPWSTR access;
  63. for (i=1;i<argc;i++) {
  64. if ((argv[i][0] == '-') ||
  65. (argv[i][0] == '/')) {
  66. switch (argv[i][1]) {
  67. case 'c':
  68. if (++i == argc) {
  69. Usage();
  70. }
  71. ClusterName = GetString(argv[i]);
  72. break;
  73. case 'n':
  74. if ( ++i == argc ) {
  75. Usage();
  76. }
  77. NodeName = GetString(argv[i]);
  78. break;
  79. case 'r':
  80. if ( ++i == argc ) {
  81. Usage();
  82. }
  83. ResourceTypeName = GetString(argv[i]);
  84. fprintf(stdout, "Resource = %ws\n", ResourceTypeName);
  85. break;
  86. case 'a':
  87. if ( ++i == argc ) {
  88. Usage();
  89. }
  90. access = GetString(argv[i]);
  91. if ( lstrcmpiW( access, L"read" ) ) {
  92. Access = CLUS_ACCESS_READ;
  93. } else if ( lstrcmpiW( access, L"write" ) ) {
  94. Access = CLUS_ACCESS_WRITE;
  95. } else if ( lstrcmpiW( access, L"any" ) ) {
  96. Access = CLUS_ACCESS_ANY;
  97. } else {
  98. Usage();
  99. }
  100. break;
  101. default:
  102. Usage();
  103. break;
  104. }
  105. } else {
  106. ControlData = argv[i];
  107. IntCount = sscanf( ControlData, "%d", &Value );
  108. if ( IntCount == 1 ) {
  109. sprintf( TestValue, "%d\0", Value );
  110. if ( strcmp( TestValue, ControlData ) == 0 ) {
  111. ControlCode = Value;
  112. fprintf(stdout, "ControlCode = %d\n", ControlCode);
  113. }
  114. }
  115. }
  116. }
  117. if ( ControlCode == 0xffffffff ) {
  118. Usage();
  119. }
  120. }
  121. _cdecl
  122. main (argc, argv)
  123. int argc;
  124. char *argv[];
  125. {
  126. HCLUSTER hClus;
  127. HRESOURCE hResource;
  128. HNODE hNode = NULL;
  129. DWORD status;
  130. DWORD ReturnSize;
  131. DWORD bufSize;
  132. CHAR InBuffer[64];
  133. DWORD i,j;
  134. LPDWORD Data;
  135. LPDWORD PrintData;
  136. CHAR PrintBuffer[32];
  137. PUCHAR buffer;
  138. DWORD controlCode;
  139. ParseArgs(argc, argv);
  140. hClus = OpenCluster(ClusterName);
  141. if (hClus == NULL) {
  142. fprintf(stderr,
  143. "OpenCluster %ws failed %d\n",
  144. (ClusterName == NULL) ? L"(NULL)" : ClusterName,
  145. GetLastError());
  146. return(0);
  147. }
  148. if ( NodeName != NULL ) {
  149. hNode = OpenClusterNode( hClus, NodeName );
  150. if ( hNode == NULL ) {
  151. fprintf(stderr,
  152. "OpenNode %ws failed %d\n", NodeName, GetLastError());
  153. return(0);
  154. }
  155. }
  156. controlCode = CLCTL_EXTERNAL_CODE( ControlCode, Access, CLUS_NO_MODIFY );
  157. controlCode = CLUSCTL_RESOURCE_TYPE_CODE( controlCode );
  158. ReturnSize = 0;
  159. status = ClusterResourceTypeControl( hClus,
  160. ResourceTypeName,
  161. hNode,
  162. controlCode,
  163. NULL,
  164. 0,
  165. NULL,
  166. 0,
  167. &ReturnSize );
  168. fprintf(stdout, "Status of initial request is %d, size is %d.\n",
  169. status, ReturnSize);
  170. if ( (status != ERROR_SUCCESS) ||
  171. (ReturnSize == 0) ) {
  172. return(0);
  173. }
  174. bufSize = ReturnSize;
  175. buffer = LocalAlloc( LMEM_FIXED, bufSize );
  176. if ( buffer == NULL ) {
  177. fprintf(stdout, "Failed to allocate a return buffer.\n");
  178. return(0);
  179. }
  180. status = ClusterResourceTypeControl( hClus,
  181. ResourceTypeName,
  182. hNode,
  183. controlCode,
  184. NULL,
  185. 0,
  186. buffer,
  187. bufSize,
  188. &ReturnSize );
  189. fprintf(stdout, "Status of Control request = %d, size = %d\n",
  190. status, ReturnSize);
  191. if ( status == ERROR_SUCCESS ) {
  192. Data = (LPDWORD)buffer;
  193. PrintData = (LPDWORD)PrintBuffer;
  194. while ( ReturnSize ) {
  195. j = ReturnSize;
  196. if ( j > 16 ) j = 16;
  197. ZeroMemory(PrintBuffer, 18);
  198. MoveMemory(PrintBuffer, Data, j);
  199. ReturnSize -= j;
  200. for ( i = 0; i < 4; i++ ) {
  201. fprintf(stdout,
  202. " %08lx", PrintData[i]);
  203. }
  204. fprintf(stdout, " ");
  205. for ( i = 0; i < 16; i++ ) {
  206. fprintf(stdout, "%c",
  207. isprint(PrintBuffer[i])?PrintBuffer[i]:'.');
  208. }
  209. Data += 4;
  210. fprintf(stdout, "\n");
  211. }
  212. }
  213. LocalFree(buffer);
  214. return(0);
  215. }