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.

533 lines
12 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1997.
  5. //
  6. // File: utils.cxx
  7. //
  8. // Contents: general purpose utility functions
  9. //
  10. // Classes:
  11. //
  12. // Functions:
  13. //
  14. // Coupling:
  15. //
  16. // Notes: right now only operator<< for different types
  17. // must init crit sec for rand on your own
  18. //
  19. // History: 9-11-1996 benl Created
  20. //
  21. //----------------------------------------------------------------------------
  22. #include "pch.hxx"
  23. #include <stdio.h>
  24. #include <limits.h>
  25. #include <stdlib.h>
  26. #include "mydebug.hxx"
  27. #include "utils.hxx"
  28. #include "randpeak.hxx"
  29. static CRITICAL_SECTION gcsRand;
  30. static BOOLEAN gfInit;
  31. //+---------------------------------------------------------------------------
  32. //
  33. // Function: PrintGuid
  34. //
  35. // Synopsis:
  36. //
  37. // Arguments: [file] --
  38. // [guid] --
  39. //
  40. // Returns:
  41. //
  42. // History: 1-27-1997 benl Created
  43. //
  44. // Notes:
  45. //
  46. //----------------------------------------------------------------------------
  47. void PrintGuid(FILE * file, const GUID & guid)
  48. {
  49. INT iIndex;
  50. fprintf(file, "%08x-%04hx-%04hx-", guid.Data1, guid.Data2, guid.Data3);
  51. for (iIndex=0;iIndex < 8; iIndex++)
  52. {
  53. fprintf(file,"%01x", guid.Data4[iIndex]);
  54. }
  55. } //PrintGuid
  56. //+---------------------------------------------------------------------------
  57. //
  58. // Function: MyRand
  59. //
  60. // Synopsis: simple rand function
  61. //
  62. // Arguments: [dwLimit] --
  63. //
  64. // Returns: values btwn 0 and dwLimit inclusively
  65. //
  66. // History: 10-23-1996 benl Created
  67. //
  68. // Notes:
  69. //
  70. //----------------------------------------------------------------------------
  71. INT MyRand(INT iLimit)
  72. {
  73. return RandomInRange(0, iLimit);
  74. } //MyRand
  75. //+---------------------------------------------------------------------------
  76. //
  77. // Function: MyRand64
  78. //
  79. // Synopsis: like above but for 64 bit integers
  80. //
  81. // Arguments: [llLimit] --
  82. //
  83. // Returns:
  84. //
  85. // History: 2-12-1997 benl Created
  86. //
  87. // Notes: This works poorly - need a true 64bit random number generator
  88. //
  89. //----------------------------------------------------------------------------
  90. LONGLONG MyRand64(LONGLONG llLimit)
  91. {
  92. LARGE_INTEGER liTemp;
  93. liTemp.LowPart = Random32();
  94. liTemp.HighPart = Random32();
  95. return liTemp.QuadPart % llLimit;
  96. } //MyRand64
  97. //+---------------------------------------------------------------------------
  98. //
  99. // Function: MyRand16
  100. //
  101. // Synopsis: like above but for 16 bit integers
  102. //
  103. // Arguments: [sLimit] --
  104. //
  105. // Returns:
  106. //
  107. // History: 5-15-1997 benl Created
  108. //
  109. // Notes:
  110. //
  111. //----------------------------------------------------------------------------
  112. SHORT MyRand16(SHORT sLimit)
  113. {
  114. return (SHORT) RandomInRange(0, sLimit);
  115. } // MyRand16
  116. //+---------------------------------------------------------------------------
  117. //
  118. // Function: MySRand
  119. //
  120. // Synopsis: srand for threads
  121. //
  122. // Arguments: [dwBase] --
  123. //
  124. // Returns:
  125. //
  126. // History: 10-30-1996 benl Created
  127. //
  128. // Notes:
  129. //
  130. //----------------------------------------------------------------------------
  131. VOID MySRand(DWORD & dwBase)
  132. {
  133. if (!gfInit)
  134. {
  135. InitializeCriticalSection(&gcsRand);
  136. gfInit = TRUE;
  137. }
  138. EnterCriticalSection(&gcsRand);
  139. dwBase++;
  140. SeedRandom32(dwBase);
  141. LeaveCriticalSection(&gcsRand);
  142. } //MySRand
  143. //+---------------------------------------------------------------------------
  144. //
  145. // Function: SwapBuffers
  146. //
  147. // Synopsis: Swap two differently sized buffers such that
  148. // the info is split correctly between them
  149. // i.e if one is 40 bytes and the second 60 bytes
  150. // after its done the first one contains 40 bytes from the orig 2nd buffer
  151. // and the 2nd one contains the following orig 20 bytes of the 2nd buffer and
  152. // then the orig 40. bytes of the first buffer
  153. //
  154. // Arguments: [cbBuf1] -- len of pBuffer1
  155. // [pBuffer1] -- buffer1
  156. // [cbBuf2] -- len of pBuffer2
  157. // [pBuffer2] -- buffer2
  158. //
  159. // Returns:
  160. //
  161. // History: 9-29-1997 benl Created
  162. //
  163. // Notes:
  164. //
  165. //----------------------------------------------------------------------------
  166. void SwapBuffers(INT cbBuf1, BYTE * pBuffer1, INT cbBuf2, BYTE * pBuffer2)
  167. {
  168. BYTE * pTemp = new BYTE[cbBuf1];
  169. INT iFirst;
  170. INT iSecond;
  171. INT iThird;
  172. memcpy(pTemp, pBuffer1, cbBuf1);
  173. iFirst = min(cbBuf1, cbBuf2);
  174. memcpy(pBuffer1, pBuffer2, iFirst);
  175. if (iFirst < cbBuf1)
  176. {
  177. memcpy(pBuffer1 + iFirst, pTemp, cbBuf1 - iFirst);
  178. iSecond = 0;
  179. iThird = cbBuf1 + iFirst;
  180. } else
  181. {
  182. memcpy(pBuffer2, pBuffer1 + iFirst, cbBuf2 - iFirst);
  183. iSecond = cbBuf2 - iFirst;
  184. iThird = 0;
  185. }
  186. memcpy(pBuffer2 + iSecond, pTemp + iThird, cbBuf2 - iSecond);
  187. if (pTemp)
  188. {
  189. delete[] pTemp;
  190. }
  191. } // SwapBuffers
  192. //+---------------------------------------------------------------------------
  193. //
  194. // Function: PrintByte
  195. //
  196. // Synopsis:
  197. //
  198. // Arguments: [byte] --
  199. //
  200. // Returns:
  201. //
  202. // History: 11-14-1996 benl Created
  203. //
  204. // Notes:
  205. //
  206. //----------------------------------------------------------------------------
  207. void PrintByte(BYTE byte)
  208. {
  209. printf("%02hx", byte);
  210. } //PrintByte
  211. //+---------------------------------------------------------------------------
  212. //
  213. // Function: PrintWord
  214. //
  215. // Synopsis:
  216. //
  217. // Arguments: [bytes] --
  218. //
  219. // Returns:
  220. //
  221. // History: 11-14-1996 benl Created
  222. //
  223. // Notes:
  224. //
  225. //----------------------------------------------------------------------------
  226. void PrintWord(LPBYTE bytes)
  227. {
  228. PrintByte(bytes[0]);
  229. printf(" ");
  230. PrintByte(bytes[1]);
  231. } //PrintWord
  232. //+---------------------------------------------------------------------------
  233. //
  234. // Function: PrintDWord
  235. //
  236. // Synopsis:
  237. //
  238. // Arguments: [bytes] --
  239. //
  240. // Returns:
  241. //
  242. // History: 11-14-1996 benl Created
  243. //
  244. // Notes:
  245. //
  246. //----------------------------------------------------------------------------
  247. void PrintDWord(LPBYTE bytes)
  248. {
  249. PrintWord(bytes);
  250. printf(" ");
  251. PrintWord(bytes + 2);
  252. } //PrintDWord
  253. //+---------------------------------------------------------------------------
  254. //
  255. // Function: DumpRawBytes
  256. //
  257. // Synopsis: Helper output function
  258. //
  259. // Arguments: [pBytes] --
  260. // [cBytes] --
  261. //
  262. // Returns:
  263. //
  264. // History: 11-14-1996 benl Created
  265. //
  266. // Notes:
  267. //
  268. //----------------------------------------------------------------------------
  269. void DumpRawBytes(BYTE * pBytes, UINT cBytes)
  270. {
  271. UINT iIndex;
  272. UINT iIndex2;
  273. if (0 == cBytes)
  274. {
  275. printf("Empty Buffer\n");
  276. }
  277. /*
  278. if (cBytes < 16)
  279. {
  280. printf("%04x ",iIndex * 16);
  281. for(iIndex=0; iIndex < cBytes; iIndex++)
  282. {
  283. PrintByte(*(pBytes + iIndex));
  284. printf(" ");
  285. }
  286. }
  287. */
  288. for (iIndex=0;iIndex < cBytes / 16; iIndex++)
  289. {
  290. printf("%04x ",iIndex * 16);
  291. PrintDWord(pBytes + (iIndex * 16));
  292. printf(" ");
  293. PrintDWord(pBytes + (iIndex * 16 + 4));
  294. printf(" ");
  295. PrintDWord(pBytes + (iIndex * 16 + 8));
  296. printf(" ");
  297. PrintDWord(pBytes + (iIndex * 16 + 12));
  298. printf(" ");
  299. for (iIndex2=0;iIndex2 < 16; iIndex2++)
  300. {
  301. if (isgraph(pBytes[(iIndex*16) + iIndex2]))
  302. {
  303. printf("%c", pBytes[(iIndex*16) + iIndex2]);
  304. } else
  305. {
  306. printf(".");
  307. }
  308. }
  309. printf("\n");
  310. }
  311. //print trailing bytes
  312. printf("%04x ", ((cBytes / 16) * 16));
  313. for (iIndex=0; iIndex < 16; iIndex++)
  314. {
  315. if (iIndex < cBytes % 16)
  316. {
  317. PrintByte(*(pBytes + ((cBytes / 16) * 16) + iIndex));
  318. printf(" ");
  319. } else
  320. {
  321. printf(" ");
  322. }
  323. //add byte separator if necc.
  324. if (iIndex && (iIndex % 7 == 0))
  325. {
  326. printf(" ");
  327. }
  328. }
  329. for (iIndex2=0; iIndex2 < cBytes % 16; iIndex2++)
  330. {
  331. if (isgraph(*(pBytes + ((cBytes / 16) * 16) + iIndex2)))
  332. {
  333. printf("%c", *(pBytes + ((cBytes / 16) * 16) + iIndex2));
  334. } else
  335. {
  336. printf(".");
  337. }
  338. }
  339. printf("\n");
  340. } //DumpRawBytes
  341. //+---------------------------------------------------------------------------
  342. //
  343. // Function: DumpRawDwords
  344. //
  345. // Synopsis:
  346. //
  347. // Arguments: [pDwords] --
  348. // [cBytes] --
  349. //
  350. // Returns:
  351. //
  352. // History: 8-25-1998 benl Created
  353. //
  354. // Notes:
  355. //
  356. //----------------------------------------------------------------------------
  357. void DumpRawDwords(DWORD * pDwords, UINT cBytes)
  358. {
  359. UINT iIndex;
  360. UINT iIndex2;
  361. BYTE * pBytes;
  362. if (0 == cBytes)
  363. {
  364. printf("Empty Buffer\n");
  365. }
  366. for (iIndex=0; iIndex < cBytes / 16; iIndex++)
  367. {
  368. printf("%04x ",iIndex * 16);
  369. printf("%08x ", pDwords[iIndex * 4]);
  370. printf("%08x ", pDwords[iIndex * 4 + 1]);
  371. printf("%08x ", pDwords[iIndex * 4 + 2]);
  372. printf("%08x ", pDwords[iIndex * 4 + 3]);
  373. printf(" ");
  374. pBytes = (BYTE *) (pDwords + (iIndex * 4));
  375. for (iIndex2=0; iIndex2 < 16; iIndex2++)
  376. {
  377. if (isgraph(pBytes[iIndex2]))
  378. {
  379. printf("%c", pBytes[iIndex2]);
  380. } else
  381. {
  382. printf(".");
  383. }
  384. }
  385. printf("\n");
  386. }
  387. //print trailing dwords
  388. printf("%04x ", ((cBytes / 16) * 16));
  389. for (iIndex=0; iIndex < 4; iIndex++)
  390. {
  391. if (iIndex * 4 < cBytes % 16)
  392. {
  393. printf("%08x", pDwords[((cBytes / 16) * 4) +iIndex]);
  394. printf(" ");
  395. } else
  396. {
  397. printf(" ");
  398. }
  399. }
  400. printf(" ");
  401. pBytes = (BYTE *) (pDwords + ((cBytes / 16) * 4));
  402. for (iIndex2=0; iIndex2 < cBytes % 16; iIndex2++)
  403. {
  404. if (isgraph(*(pBytes + iIndex2)))
  405. {
  406. printf("%c", *(pBytes + iIndex2));
  407. } else
  408. {
  409. printf(".");
  410. }
  411. }
  412. printf("\n");
  413. } // DumpRawDwords
  414. //+---------------------------------------------------------------------------
  415. //
  416. // Function: HexStrToInt64
  417. //
  418. // Synopsis:
  419. //
  420. // Arguments: [szIn] --
  421. // [i64Out] --
  422. //
  423. // Returns:
  424. //
  425. // History: 5-30-96 benl Created
  426. //
  427. // Notes:
  428. //
  429. //----------------------------------------------------------------------------
  430. void HexStrToInt64(LPCTSTR szIn, __int64 & i64Out)
  431. {
  432. int i;
  433. const TCHAR * szTmp = szIn;
  434. i64Out = 0;
  435. /*
  436. if (szTmp[0] != '0' && szTmp[1] != 'x') {
  437. return;
  438. }
  439. //move past prefix
  440. szTmp+=2;
  441. */
  442. while (*szTmp != _T('\0') &&
  443. (_istdigit(*szTmp) || (_totlower(*szTmp) >= 'a' && _totlower(*szTmp) <= 'f')))
  444. {
  445. i64Out *= 16;
  446. if (_istdigit(*szTmp))
  447. {
  448. i64Out += *szTmp - _T('0');
  449. } else
  450. {
  451. i64Out += _totlower(*szTmp) - _T('a') + 10;
  452. }
  453. szTmp++;
  454. } //endwhile
  455. } //HexStrToInt64