Changeset 21717 for branches/gcc-kmk/src
- Timestamp:
- Oct 18, 2011, 9:16:41 PM (14 years ago)
- Location:
- branches/gcc-kmk/src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/gcc-kmk/src/kernel32/HandleManager.cpp
r21374 r21717 533 533 *****************************************************************************/ 534 534 535 DWORD HMDeviceRegisterEx(LP STRpszDeviceName,535 DWORD HMDeviceRegisterEx(LPCSTR pszDeviceName, 536 536 HMDeviceHandler *pDeviceHandler, 537 537 VOID *pDevData) … … 564 564 } 565 565 566 DWORD HMDeviceRegister(LP STRpszDeviceName,566 DWORD HMDeviceRegister(LPCSTR pszDeviceName, 567 567 HMDeviceHandler *pDeviceHandler) 568 568 { -
branches/gcc-kmk/src/kernel32/_ras.cpp
r21342 r21717 18 18 19 19 /* RAS functions to isolate all RAS related services: 20 * 20 * 21 21 * - Common statistic functions to track objects allocations/deallocations. 22 22 * … … 29 29 * Note: RAS subsystem does not use any other Odin subsystem, and IMO must not. 30 30 * That is RAS has its own heap, serialization, logging. 31 * External stuff that is used: 31 * External stuff that is used: 32 32 * - from Odin: asm helpers from interlock.asm 33 33 * - from libc: uheap functions 34 * 34 * 35 35 * The following has been borrowed from other Odin parts and adapted: 36 36 * - critical section … … 48 48 typedef struct _RAS_TRACK RAS_TRACK; 49 49 50 typedef struct _RAS_OBJECT_INFO 50 typedef struct _RAS_OBJECT_INFO 51 51 { 52 52 struct _RAS_OBJECT_INFO *next; 53 53 struct _RAS_OBJECT_INFO *prev; 54 54 55 55 RAS_TRACK_HANDLE h; 56 56 57 57 ULONG objident; 58 58 ULONG usecount; 59 59 60 60 ULONG objhandle; 61 61 62 62 void *objdata; 63 63 ULONG cbobjdata; 64 64 65 65 char userdata[1]; 66 66 } RAS_OBJECT_INFO; … … 73 73 RAS_OBJECT_INFO *objfirst; 74 74 RAS_OBJECT_INFO *objlast; 75 75 76 76 char objname[80]; 77 77 78 78 ULONG cbuserdata; 79 79 80 80 ULONG fLogObjectContent: 1; 81 81 ULONG fMemory: 1; 82 82 ULONG fLogAtExit: 1; 83 83 ULONG fLogObjectsAtExit: 1; 84 84 85 85 FNLOC *pfnLogObjectContent; 86 86 FNCOC *pfnCompareObjectContent; 87 87 88 88 /* Used when fMemory = 1 for RasTrackAlloc, Realloc and Free calls */ 89 89 ULONG cAllocs; 90 90 ULONG cFrees; 91 91 ULONG cbTotalAllocated; 92 92 93 93 }; 94 94 … … 119 119 120 120 ULONG hlogfile; // filehandle if default logging functions are used 121 121 122 122 HMODULE hmod; 123 123 } RasLogChannel; … … 126 126 { 127 127 HMODULE hmod; // handle of this dll 128 128 129 129 RasLogChannel rlc; 130 130 131 131 Heap_t rasheap; 132 132 void *pHeapMem; 133 133 ULONG ulRefCount; 134 134 ULONG flAllocMem; 135 135 136 136 HMODULE hmodPlugin; 137 137 138 138 RasEntryTable ret; 139 139 RasPluginEntryTable pet; … … 181 181 182 182 DosGetInfoBlocks(&ptib, &ppib); 183 183 184 184 return ppib->pib_ulpid << 16 | ptib->tib_ptib2->tib2_ultid; 185 185 } … … 188 188 { 189 189 int rc = NO_ERROR; 190 190 191 191 rc = DosCreateEventSem (NULL, &crit->hevLock, DC_SEM_SHARED, 0); 192 192 193 193 if (rc != NO_ERROR) 194 194 { 195 195 crit->hevLock = 0; 196 196 } 197 197 198 198 return rc; 199 199 } … … 207 207 { 208 208 APIRET rc = NO_ERROR; 209 209 210 210 ULONG threadid = rasGetCurrentThreadId (); 211 211 212 212 // We want to acquire the section, count the entering 213 213 DosInterlockedIncrement (&crit->LockCount); 214 214 215 215 if (crit->OwningThread == threadid) 216 216 { … … 228 228 break; 229 229 } 230 230 231 231 rc = DosWaitEventSem (crit->hevLock, ulTimeout); 232 233 if (rc != NO_ERROR) 232 233 if (rc != NO_ERROR) 234 234 { 235 235 // We fail, deregister itself … … 238 238 } 239 239 } 240 240 241 241 // the section was successfully aquired 242 242 crit->RecursionCount = 1; 243 243 244 244 return NO_ERROR; 245 245 } … … 256 256 { 257 257 DosInterlockedDecrement (&crit->LockCount); 258 258 259 259 return NO_ERROR; 260 260 } 261 261 262 262 crit->OwningThread = 0; 263 263 … … 270 270 DosResetEventSem (crit->hevLock, &ulnrposts); 271 271 } 272 272 273 273 return NO_ERROR; 274 274 } … … 287 287 void ulong2string (unsigned long number, char *string, int n, int base) 288 288 { 289 static c har *digits = "0123456789ABCDEF";290 289 static const char *digits = "0123456789ABCDEF"; 290 291 291 unsigned long tmp = number; 292 292 char *s = string; … … 294 294 int l = 0; 295 295 int i; 296 296 297 297 if (n <= 0) 298 298 { 299 299 return; 300 300 } 301 301 302 302 if (tmp == 0) 303 303 { 304 304 s[l++] = digits[0]; 305 305 } 306 306 307 307 while (tmp != 0) 308 308 { … … 319 319 s[l++] = '\0'; 320 320 } 321 321 322 322 s = string; 323 323 324 324 for (i = 0; i < len/2; i++) 325 325 { … … 338 338 return; 339 339 } 340 340 341 341 if (number < 0) 342 342 { … … 345 345 n--; 346 346 } 347 347 348 348 ulong2string (number, string, n, base); 349 349 } 350 350 351 351 int string2ulong (const char *string, char **pstring2, unsigned long *pvalue, int base) 352 352 { 353 353 unsigned long value = 0; 354 354 int sign = 1; 355 355 356 356 const char *p = string; 357 357 358 358 if (p[0] == '-') 359 359 { … … 361 361 p++; 362 362 } 363 363 364 364 if (base == 0) 365 365 { … … 379 379 } 380 380 } 381 381 382 382 while (*p) 383 383 { 384 384 int digit = 0; 385 385 386 386 if ('0' <= *p && *p <= '9') 387 387 { … … 400 400 break; 401 401 } 402 402 403 403 if (digit >= base) 404 404 { 405 405 break; 406 406 } 407 407 408 408 value = value*base + digit; 409 409 410 410 p++; 411 411 } 412 412 413 413 if (pstring2) 414 414 { 415 415 *pstring2 = (char *)p; 416 416 } 417 417 418 418 *pvalue = sign*value; 419 419 420 420 return 1; 421 421 } … … 426 426 char *s = (char *)fmt; 427 427 char *d = buf; 428 428 429 429 if (n <= 0) 430 430 { 431 431 return 0; 432 432 } 433 433 434 434 n--; 435 435 436 436 while (*s && count < n) 437 437 { 438 438 char tmpstr[16]; 439 439 440 440 char *str = NULL; 441 441 442 442 int width = 0; 443 443 int precision = 0; 444 444 445 445 if (*s == '%') 446 446 { 447 447 s++; 448 448 449 449 if ('0' <= *s && *s <= '9' || *s == '-') 450 450 { … … 462 462 string2ulong (s, &s, (unsigned long *)&precision, 10); 463 463 } 464 464 465 465 if (*s == 's') 466 466 { … … 480 480 { 481 481 int num = va_arg(args, int); 482 482 483 483 ulong2string (num, tmpstr, sizeof (tmpstr), 16); 484 484 485 485 str = &tmpstr[0]; 486 486 s++; … … 494 494 s++; 495 495 } 496 496 497 497 if (*s == 'd' || *s == 'i') 498 498 { 499 499 int num = va_arg(args, int); 500 500 501 501 long2string (num, tmpstr, sizeof (tmpstr), 10); 502 502 503 503 str = &tmpstr[0]; 504 504 s++; … … 507 507 { 508 508 int num = va_arg(args, int); 509 509 510 510 ulong2string (num, tmpstr, sizeof (tmpstr), 10); 511 511 512 512 str = &tmpstr[0]; 513 513 s++; … … 516 516 { 517 517 int num = va_arg(args, int); 518 518 519 519 ulong2string (num, tmpstr, sizeof (tmpstr), 16); 520 520 521 521 str = &tmpstr[0]; 522 522 s++; … … 524 524 } 525 525 } 526 526 527 527 if (str != NULL) 528 528 { … … 531 531 int len = strlen (str); 532 532 int leftalign = 0; 533 533 534 534 if (width < 0) 535 535 { … … 537 537 leftalign = 1; 538 538 } 539 539 540 540 if (precision) 541 541 { … … 546 546 precision--; 547 547 } 548 548 549 549 memcpy (&numstr[i], str, len); 550 550 551 551 str = &numstr[0]; 552 552 len += i; 553 553 } 554 554 555 555 if (len < width && !leftalign) 556 556 { … … 561 561 count++; 562 562 } 563 563 564 564 if (count >= n) 565 565 { … … 567 567 } 568 568 } 569 569 570 570 i = 0; 571 571 while (i < len && count < n) … … 574 574 count++; 575 575 } 576 576 577 577 if (count >= n) 578 578 { 579 579 break; 580 580 } 581 581 582 582 if (len < width && leftalign) 583 583 { … … 588 588 count++; 589 589 } 590 590 591 591 if (count >= n) 592 592 { … … 601 601 } 602 602 } 603 603 604 604 *d = '\0'; 605 605 606 606 return count + 1; 607 607 } … … 610 610 { 611 611 va_list args; 612 612 613 613 int rc = 0; 614 614 615 615 va_start (args, fmt); 616 616 617 617 rc = vsnprintf (buf, n, fmt, args); 618 618 619 619 va_end (args); 620 620 621 621 return rc; 622 622 } … … 625 625 { 626 626 ULONG ulAction = 0; 627 627 628 628 int rc = DosOpen (logfilename, ph, &ulAction, 0L, FILE_ARCHIVED, 629 629 OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS, 630 630 OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYNONE | 631 631 OPEN_ACCESS_READWRITE, 0L); 632 632 633 633 if (rc == ERROR_TOO_MANY_OPEN_FILES) 634 634 { 635 635 LONG lReqCount = 10l; 636 636 ULONG ulCurMaxFH = 0ul; 637 637 638 638 DosSetRelMaxFH (&lReqCount, &ulCurMaxFH); 639 639 640 640 rc = DosOpen (logfilename, ph, &ulAction, 0L, FILE_ARCHIVED, 641 641 OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS, … … 643 643 OPEN_ACCESS_READWRITE, 0L); 644 644 } 645 645 646 646 if (rc != NO_ERROR) 647 647 { 648 648 *ph = -1; 649 649 } 650 650 651 651 return rc; 652 652 } … … 660 660 { 661 661 ULONG ulActual = 0; 662 662 663 663 DosWrite ((HFILE)h, msg, len, &ulActual); 664 664 } … … 671 671 prlc->hlogfile = -1; 672 672 } 673 673 674 674 if (prlc->hmod) 675 675 { … … 677 677 prlc->hmod = NULLHANDLE; 678 678 } 679 679 680 680 prlc->pfnWriteLog = NULL; 681 681 prlc->pfnOpenLogFile = NULL; … … 687 687 { 688 688 int rc = NO_ERROR; 689 689 690 690 const char *env = NULL; 691 691 692 692 DosScanEnv (env_loghandler, &env); 693 693 694 694 HMODULE hmod = NULLHANDLE; 695 695 696 696 PFN popenlogfile = NULL; 697 697 PFN pcloselogfile = NULL; 698 698 PFN pwritelog = NULL; 699 699 700 700 if (env) 701 701 { 702 702 rc = DosLoadModule (NULL, 0, env, &hmod); 703 703 704 704 if (rc == NO_ERROR) 705 705 { 706 706 rc = DosQueryProcAddr (hmod, 0, "WIN32RAS_OPENLOGFILE", &popenlogfile); 707 707 } 708 708 709 709 if (rc == NO_ERROR) 710 710 { 711 711 rc = DosQueryProcAddr (hmod, 0, "WIN32RAS_CLOSELOGFILE", &pcloselogfile); 712 712 } 713 713 714 714 if (rc == NO_ERROR) 715 715 { 716 716 rc = DosQueryProcAddr (hmod, 0, "WIN32RAS_WRITELOG", &pwritelog); 717 717 } 718 718 719 719 if (rc != NO_ERROR && hmod) 720 720 { … … 723 723 } 724 724 } 725 725 726 726 if (rc == NO_ERROR && hmod && popenlogfile && pcloselogfile && pwritelog) 727 727 { … … 739 739 prlc->hlogfile = -1; 740 740 prlc->hmod = NULLHANDLE; 741 741 742 742 rc = NO_ERROR; 743 743 } 744 744 745 745 rc = prlc->pfnOpenLogFile (&prlc->hlogfile, filename); 746 746 747 747 if (rc != NO_ERROR) 748 748 { … … 750 750 rasCloseLogChannel (prlc); 751 751 } 752 752 753 753 return rc; 754 754 } … … 757 757 { 758 758 int rc = NO_ERROR; 759 759 760 760 const char *filename = "win32ras.log"; 761 761 762 762 const char *env = NULL; 763 763 764 764 DosScanEnv ("WIN32RAS_LOG_FILENAME", &env); 765 765 766 766 if (env) 767 767 { 768 768 filename = env; 769 769 } 770 770 771 771 char uniqueLogFileName[260]; 772 772 773 773 snprintf (uniqueLogFileName, sizeof(uniqueLogFileName), 774 774 "%s.%d", filename, loadNr); 775 775 776 776 if (rasdata.rlc.hlogfile == -1) 777 777 { 778 778 rc = rasOpenLogChannel ("WIN32RAS_LOGHANDLER", &rasdata.rlc, uniqueLogFileName); 779 779 } 780 780 781 781 return rc; 782 782 } … … 787 787 } 788 788 789 void rasLogInternalV (RAS_LOG_CHANNEL_H hchannel, c har *fmt, va_list args)789 void rasLogInternalV (RAS_LOG_CHANNEL_H hchannel, const char *fmt, va_list args) 790 790 { 791 791 static char szOutMsg[4096]; 792 792 793 793 ULONG ulHdrLen = snprintf (szOutMsg, sizeof (szOutMsg), "%s", ""); 794 794 795 795 ulHdrLen -= 1; 796 796 797 797 ULONG ulMsgLen = vsnprintf (&szOutMsg[ulHdrLen], sizeof (szOutMsg) - ulHdrLen, fmt, args); 798 798 799 799 ulMsgLen -= 1; 800 800 801 801 if (ulMsgLen > 0) 802 802 { … … 810 810 } 811 811 } 812 812 813 813 RasLogChannel *prlc = hchannel? (RasLogChannel *)hchannel: &rasdata.rlc; 814 814 815 815 prlc->pfnWriteLog (prlc->hlogfile, szOutMsg, ulMsgLen + ulHdrLen); 816 816 } 817 817 } 818 818 819 void rasLog (c har *fmt, ...)819 void rasLog (const char *fmt, ...) 820 820 { 821 821 va_list args; 822 822 823 823 va_start (args, fmt); 824 824 825 825 rasLogInternalV (NULL, fmt, args); 826 826 827 827 va_end (args); 828 828 } 829 829 830 void rasLogInternal (c har *fmt, ...)830 void rasLogInternal (const char *fmt, ...) 831 831 { 832 832 va_list args; 833 833 834 834 va_start (args, fmt); 835 835 836 836 rasLogInternalV (NULL, fmt, args); 837 837 838 838 va_end (args); 839 839 } 840 840 841 void WIN32API rasLogExternal (c har *fmt, ...)841 void WIN32API rasLogExternal (const char *fmt, ...) 842 842 { 843 843 va_list args; … … 846 846 847 847 va_start (args, fmt); 848 848 849 849 rasLogInternalV (NULL, fmt, args); 850 850 851 851 va_end (args); 852 852 853 853 SetFS (sel); 854 854 } … … 876 876 877 877 *clean = _BLOCK_CLEAN; 878 878 879 879 rc = DosAllocSharedMem (&p, NULL, *size, rasdata.flAllocMem | OBJ_GETTABLE); 880 880 881 881 if (rc != NO_ERROR) 882 882 { 883 883 rasLog ("RAS heap: getmore_fn: DosAllocSharedMem failed, rc = %d\n", rc); 884 884 } 885 885 886 886 return p; 887 887 } … … 906 906 { 907 907 rasdata.flAllocMem = PAG_READ | PAG_WRITE | PAG_COMMIT; 908 908 909 909 if (rascfg.fUseHighMem) 910 910 { 911 911 ULONG ulSysinfo = 0; 912 912 913 913 rc = DosQuerySysInfo (QSV_VIRTUALADDRESSLIMIT, QSV_VIRTUALADDRESSLIMIT, &ulSysinfo, sizeof (ulSysinfo)); 914 914 915 915 if (rc == NO_ERROR && ulSysinfo > 512) // VirtualAddresslimit is in MB 916 916 { 917 917 rasdata.flAllocMem |= PAG_ANY; 918 918 919 919 rasLog ("RAS heap initialization: will use high memory\n"); 920 920 } 921 921 } 922 922 923 rc = DosAllocSharedMem (&rasdata.pHeapMem, NULL, rascfg.ulInitHeapSize, 923 rc = DosAllocSharedMem (&rasdata.pHeapMem, NULL, rascfg.ulInitHeapSize, 924 924 rasdata.flAllocMem | OBJ_GETTABLE); 925 925 if (rc != NO_ERROR) … … 928 928 return NO_ERROR; 929 929 } 930 931 rasdata.rasheap = _ucreate (rasdata.pHeapMem, rascfg.ulInitHeapSize, 930 931 rasdata.rasheap = _ucreate (rasdata.pHeapMem, rascfg.ulInitHeapSize, 932 932 _BLOCK_CLEAN, _HEAP_REGULAR | _HEAP_SHARED, 933 933 getmore_fn, release_fn); … … 936 936 { 937 937 rasLog ("RAS heap initialization: _ucreate failed\n"); 938 938 939 939 DosFreeMem (rasdata.pHeapMem); 940 940 rasdata.pHeapMem = NULL; 941 941 942 942 return ERROR_NOT_ENOUGH_MEMORY; 943 943 } … … 949 949 */ 950 950 rc = DosGetSharedMem (rasdata.pHeapMem, rasdata.flAllocMem); 951 951 952 952 if (rc != NO_ERROR) 953 953 { 954 954 rasLog ("RAS heap initialization: DosGetSharedMem failed %d\n", rc); 955 955 956 956 return rc; 957 957 } … … 960 960 { 961 961 rasLog ("RAS heap initialization: _uopen failed\n"); 962 962 963 963 DosFreeMem (rasdata.pHeapMem); 964 964 965 965 return ERROR_NOT_ENOUGH_MEMORY; 966 966 } 967 967 } 968 968 969 969 rasdata.ulRefCount++; 970 970 971 971 return NO_ERROR; 972 972 } … … 980 980 return 1; 981 981 } 982 983 if (useflag == _USEDENTRY) 982 983 if (useflag == _USEDENTRY) 984 984 { 985 985 if (filename) … … 1001 1001 { 1002 1002 rasLog ("RAS heap uninitialization: privateRefCount = %d\n", privateRefCount); 1003 1003 1004 1004 return; 1005 1005 } … … 1017 1017 1018 1018 _uclose (rasdata.rasheap); 1019 1019 1020 1020 _udestroy (rasdata.rasheap, _FORCE); 1021 1021 rasdata.rasheap = NULL; 1022 1022 } 1023 1023 1024 1024 if (rasdata.pHeapMem) 1025 1025 { … … 1028 1028 } 1029 1029 } 1030 else 1030 else 1031 1031 { 1032 1032 _uclose (rasdata.rasheap); … … 1037 1037 { 1038 1038 void *p = _umalloc(rasdata.rasheap, size); 1039 1039 1040 1040 if (p) 1041 1041 { … … 1046 1046 rasLog ("RAS heap: allocation failed, %d bytes\n", size); 1047 1047 } 1048 1048 1049 1049 return p; 1050 1050 } … … 1060 1060 { 1061 1061 RAS_TRACK_HANDLE iter = rasdata.firsttrack; 1062 1062 1063 1063 while (iter) 1064 1064 { … … 1067 1067 break; 1068 1068 } 1069 1069 1070 1070 iter = iter->next; 1071 1071 } 1072 1072 1073 1073 return iter; 1074 1074 } … … 1077 1077 { 1078 1078 static objident = 0; 1079 1079 1080 1080 objident++; 1081 1081 1082 1082 if (objident == 0) 1083 1083 { 1084 1084 objident++; 1085 1085 } 1086 1086 1087 1087 return objident; 1088 1088 } … … 1100 1100 h->objlast = h->objfirst = pinfo; 1101 1101 } 1102 1102 1103 1103 return NO_ERROR; 1104 1104 } 1105 1105 1106 1106 void rasRemoveObjectInfo (RAS_OBJECT_INFO *pinfo) 1107 1107 { … … 1115 1115 pinfo->h->objlast = pinfo->prev; 1116 1116 } 1117 1117 1118 1118 if (pinfo->prev) 1119 1119 { … … 1131 1131 { 1132 1132 pinfo->objhandle = objhandle; 1133 1133 1134 1134 pinfo->h = h; 1135 1135 1136 1136 pinfo->usecount = 1; 1137 1137 1138 1138 pinfo->objident = rasGenObjIdent (); 1139 1139 … … 1146 1146 } 1147 1147 } 1148 1148 1149 1149 pinfo->cbobjdata = cbobjdata; 1150 1150 } … … 1152 1152 struct _RAS_OBJECT_INFO *rasSearchObject2 (RAS_TRACK_HANDLE h, ULONG objident) 1153 1153 { 1154 if (!h) 1154 if (!h) 1155 1155 { 1156 1156 return NULL; … … 1158 1158 1159 1159 RAS_OBJECT_INFO *iter = h->objfirst; 1160 1160 1161 1161 while (iter) 1162 1162 { … … 1167 1167 iter = iter->next; 1168 1168 } 1169 1169 1170 1170 return iter; 1171 1171 } … … 1181 1181 struct _RAS_OBJECT_INFO *rasSearchObject (RAS_TRACK_HANDLE h, ULONG objhandle, RAS_OBJECT_INFO **ppinfo_next) 1182 1182 { 1183 if (!h) 1183 if (!h) 1184 1184 { 1185 1185 return NULL; … … 1187 1187 1188 1188 RAS_OBJECT_INFO *iter = h->objfirst; 1189 1189 1190 1190 while (iter) 1191 1191 { … … 1194 1194 break; 1195 1195 } 1196 1196 1197 1197 iter = iter->next; 1198 1198 } 1199 1199 1200 1200 if (iter && ppinfo_next) 1201 1201 { 1202 1202 *ppinfo_next = iter->next; 1203 1203 } 1204 1204 1205 1205 return iter; 1206 1206 } … … 1214 1214 { 1215 1215 pinfo->usecount--; 1216 1216 1217 1217 return pinfo->usecount; 1218 1218 } … … 1223 1223 char buf[128]; 1224 1224 char *p = &buf[0]; 1225 1225 1226 1226 if (!objdata) 1227 1227 { 1228 1228 return NO_ERROR; 1229 1229 } 1230 1230 1231 1231 for (i = 0; i < cbobjdata; i++) 1232 1232 { … … 1238 1238 p = &buf[0]; 1239 1239 } 1240 1240 1241 1241 snprintf (p, sizeof(buf) - (p - &buf[0]), "%8.8x:", i / 16); 1242 1242 p += strlen (p); 1243 1243 } 1244 1244 1245 1245 snprintf (p, sizeof(buf) - (p - &buf[0]), " %2.2x", ((char *)objdata)[i]); 1246 1246 p += strlen (p); 1247 1247 } 1248 1248 1249 1249 pRasLog ("%s\n", buf); 1250 1250 1251 1251 return NO_ERROR; 1252 1252 } … … 1258 1258 return 1; 1259 1259 } 1260 1260 1261 1261 if (objdata1 == NULL || objdata2 == NULL) 1262 1262 { … … 1264 1264 return 1; 1265 1265 } 1266 1266 1267 1267 return memcmp (objdata1, objdata2, cbobjdata1); 1268 1268 } 1269 1269 1270 ULONG rasCallLogObjectContent (RAS_TRACK_HANDLE h, RASCONTEXT_I *pctx, 1271 ULONG objident, ULONG objhandle, 1270 ULONG rasCallLogObjectContent (RAS_TRACK_HANDLE h, RASCONTEXT_I *pctx, 1271 ULONG objident, ULONG objhandle, 1272 1272 void *objdata, ULONG cbobjdata, FNRASLOG_EXTERNAL *rasLogExternal) 1273 1273 { 1274 1274 rasRestoreContext (pctx); 1275 1275 1276 1276 ULONG rc = h->pfnLogObjectContent (objident, objhandle, objdata, cbobjdata, rasLogExternal); 1277 1277 1278 1278 rasSaveContext (pctx); 1279 1279 1280 1280 return rc; 1281 1281 } 1282 1282 1283 ULONG WIN32API rasCallCompareObjectContent (RAS_TRACK_HANDLE h, RASCONTEXT_I *pctx, 1283 ULONG WIN32API rasCallCompareObjectContent (RAS_TRACK_HANDLE h, RASCONTEXT_I *pctx, 1284 1284 ULONG objhandle, void *objdata1, ULONG cbobjdata1, void *objdata2, ULONG cbobjdata2) 1285 1285 { 1286 1286 rasRestoreContext (pctx); 1287 1287 1288 1288 ULONG rc = h->pfnCompareObjectContent (objhandle, objdata1, cbobjdata1, objdata2, cbobjdata2); 1289 1289 1290 1290 rasSaveContext (pctx); 1291 1291 1292 1292 return rc; 1293 1293 } … … 1301 1301 { 1302 1302 const char *env = NULL; 1303 1303 1304 1304 DosScanEnv (name, &env); 1305 1305 1306 1306 if (env) 1307 1307 { 1308 1308 ULONG ul = 0; 1309 1309 char *e = NULL; 1310 1310 1311 1311 string2ulong (env, &e, &ul, 10); 1312 1312 1313 1313 if (e && *e == '\0') 1314 1314 { … … 1324 1324 { 1325 1325 int rc = NO_ERROR; 1326 1326 1327 1327 if (!rasdata.hmodPlugin) 1328 1328 { 1329 1329 rasdata.ret.cb = sizeof (RasEntryTable); 1330 1330 1331 1331 rasdata.ret.RasRegisterObjectTracking = RasRegisterObjectTracking; 1332 1332 rasdata.ret.RasDeregisterObjectTracking = RasDeregisterObjectTracking; … … 1353 1353 rasdata.ret.RasTrackMemFree = RasTrackMemFree; 1354 1354 rasdata.ret.RasGetTrackHandle = RasGetTrackHandle; 1355 1355 1356 1356 rasdata.pet.cb = sizeof (RasPluginEntryTable); 1357 1357 1358 1358 rasdata.pet.RasEntry = _RasEntry; 1359 1359 1360 1360 const char *env = NULL; 1361 1361 1362 1362 DosScanEnv ("WIN32RAS_PLUGIN", &env); 1363 1363 1364 1364 if (env) 1365 1365 { 1366 1366 HMODULE hmod = NULLHANDLE; 1367 1367 FNPI *pfnPluginInit = NULL; 1368 1368 1369 1369 rc = DosLoadModule (NULL, 0, env, &hmod); 1370 1370 1371 1371 if (rc == NO_ERROR) 1372 1372 { 1373 1373 rc = DosQueryProcAddr (hmod, 0, "WIN32RAS_PLUGIN_INIT", (PFN *)&pfnPluginInit); 1374 1374 } 1375 1375 1376 1376 if (rc != NO_ERROR) 1377 1377 { 1378 1378 rasLogInternal ("Could not load RAS plugin %s rc = %d", env, rc); 1379 1379 } 1380 1380 1381 1381 if (rc != NO_ERROR && hmod) 1382 1382 { … … 1386 1386 { 1387 1387 rasdata.hmodPlugin = hmod; 1388 1388 1389 1389 pfnPluginInit (rasdata.hmod, &rasdata.ret, &rasdata.pet); 1390 1390 } 1391 1391 } 1392 1392 } 1393 1393 1394 1394 return rc; 1395 1395 } … … 1398 1398 { 1399 1399 int rc = NO_ERROR; 1400 1400 1401 1401 if (rasdata.hmodPlugin) 1402 1402 { 1403 1403 HMODULE hmod = rasdata.hmodPlugin; 1404 1404 FNPE *pfnPluginExit = NULL; 1405 1405 1406 1406 rc = DosQueryProcAddr (hmod, 0, "WIN32RAS_PLUGIN_EXIT", (PFN *)&pfnPluginExit); 1407 1407 1408 1408 if (rc == NO_ERROR) 1409 1409 { 1410 1410 pfnPluginExit (rasdata.hmod); 1411 1411 } 1412 1412 1413 1413 DosFreeModule (hmod); 1414 1414 } 1415 1415 1416 1416 return rc; 1417 1417 } … … 1463 1463 { 1464 1464 int rc = NO_ERROR; 1465 1465 1466 1466 if (!rasInitialized) 1467 1467 { 1468 1468 rasInitialized = 1; 1469 1469 1470 1470 memset (&rascfg, 0, sizeof (rascfg)); 1471 1471 1472 1472 rascfg.ulTimeout = 60000; // default 1 minute 1473 1473 rasQueryEnvUlong ("WIN32RAS_TIMEOUT", &rascfg.ulTimeout, 1, 3600, 1000); 1474 1474 1475 1475 rascfg.ulInitHeapSize = 128*1024; 1476 1476 rasQueryEnvUlong ("WIN32RAS_INITHEAPSIZE", &rascfg.ulInitHeapSize, 64, 16*1024, 1024); 1477 1477 1478 1478 ULONG ul = 0; 1479 1479 rasQueryEnvUlong ("WIN32RAS_DUMPHEAPOBJECTS", &ul, 0, 1, 1); 1480 1480 rascfg.fDumpHeapObjects = ul; 1481 1481 1482 1482 ul = 1; 1483 1483 rasQueryEnvUlong ("WIN32RAS_USEHIGHMEM", &ul, 0, 1, 1); 1484 1484 rascfg.fUseHighMem = ul; 1485 1485 1486 1486 ul = 0; 1487 1487 rasQueryEnvUlong ("WIN32RAS_ENABLE", &ul, 0, 1, 1); 1488 1488 rascfg.fRasEnable = ul; 1489 1489 1490 1490 ul = 0; 1491 1491 rasQueryEnvUlong ("WIN32RAS_BREAKPOINT", &ul, 0, 1, 1); 1492 1492 rascfg.fRasBreakPoint = ul; 1493 1493 1494 1494 memset (&rasdata, 0, sizeof (rasdata)); 1495 1495 rasdata.rlc.hlogfile = -1; 1496 1496 rasdata.hmod = hmod; 1497 1497 1498 1498 rc = NO_ERROR; 1499 1499 } 1500 1500 1501 1501 if (!rascfg.fRasEnable) 1502 1502 { … … 1510 1510 1511 1511 rc = rasInitializeLog (); 1512 1512 1513 1513 if (rc == NO_ERROR) 1514 1514 { 1515 1515 rc = rasInitializeCriticalSection (&csras); 1516 1516 } 1517 1517 1518 1518 if (rc == NO_ERROR) 1519 1519 { 1520 1520 rc = rasInitializeHeap (); 1521 1521 } 1522 1522 1523 1523 if (rc == NO_ERROR) 1524 1524 { 1525 1525 rc = rasInitializePlugin (); 1526 1526 } 1527 1527 1528 1528 return rc; 1529 1529 } … … 1532 1532 { 1533 1533 ENTER_RAS(NO_HANDLE); 1534 1534 1535 1535 /* Deregister all objects */ 1536 1536 while (rasdata.firsttrack) 1537 1537 { 1538 1538 RAS_TRACK_HANDLE iter = rasdata.firsttrack; 1539 1539 1540 1540 if (iter->fLogAtExit) 1541 1541 { 1542 1542 RasLogObjects (iter, iter->fLogObjectsAtExit? RAS_FLAG_LOG_OBJECTS: 0); 1543 1543 } 1544 1544 1545 1545 RasDeregisterObjectTracking (iter); 1546 1546 1547 1547 rasFree (iter); 1548 1548 } 1549 1549 1550 1550 rasUninitializePlugin (); 1551 1551 1552 1552 rasUninitializeHeap (); 1553 1553 1554 1554 EXIT_RAS(); 1555 1555 1556 1556 rasUninitializeCriticalSection (&csras); 1557 1558 rasUninitializeLog (); 1557 1558 rasUninitializeLog (); 1559 1559 } 1560 1560 … … 1562 1562 { 1563 1563 ENTER_RAS_RET(NO_HANDLE, NULL); 1564 1564 1565 1565 RAS_TRACK_HANDLE iter = rasdata.firsttrack; 1566 1566 1567 1567 while (iter) 1568 1568 { … … 1571 1571 break; 1572 1572 } 1573 1573 1574 1574 iter = iter->next; 1575 1575 } 1576 1576 1577 1577 EXIT_RAS(); 1578 1578 1579 1579 return iter; 1580 1580 } 1581 1581 1582 void WIN32API RasRegisterObjectTracking (RAS_TRACK_HANDLE *ph, c har *objname,1582 void WIN32API RasRegisterObjectTracking (RAS_TRACK_HANDLE *ph, const char *objname, 1583 1583 ULONG cbuserdata, 1584 1584 ULONG flags, … … 1587 1587 { 1588 1588 ENTER_RAS(NO_HANDLE); 1589 1589 1590 1590 RAS_TRACK *prt = (RAS_TRACK *)rasAlloc (sizeof (RAS_TRACK)); 1591 1591 1592 1592 if (prt) 1593 1593 { 1594 1594 strcpy (prt->objname, objname); 1595 1595 1596 1596 prt->cbuserdata = cbuserdata; 1597 1597 1598 1598 if (flags & RAS_TRACK_FLAG_LOGOBJECTCONTENT) 1599 1599 { 1600 1600 prt->fLogObjectContent = 1; 1601 1601 } 1602 1602 1603 1603 if (flags & RAS_TRACK_FLAG_MEMORY) 1604 1604 { 1605 1605 prt->fMemory = 1; 1606 1606 } 1607 1607 1608 1608 if (flags & RAS_TRACK_FLAG_LOG_AT_EXIT) 1609 1609 { 1610 1610 prt->fLogAtExit = 1; 1611 1611 } 1612 1612 1613 1613 if (flags & RAS_TRACK_FLAG_LOG_OBJECTS_AT_EXIT) 1614 1614 { 1615 1615 prt->fLogObjectsAtExit = 1; 1616 1616 } 1617 1617 1618 1618 if (pfnLogObjectContent) 1619 1619 { … … 1624 1624 prt->pfnLogObjectContent = rasLogObjectContent; 1625 1625 } 1626 1626 1627 1627 if (pfnCompareObjectContent) 1628 1628 { … … 1633 1633 prt->pfnCompareObjectContent = pfnCompareObjectContent; 1634 1634 } 1635 1635 1636 1636 /* Insert the new tracking record in the list */ 1637 1637 if (rasdata.firsttrack) … … 1645 1645 rasdata.lasttrack = rasdata.firsttrack = prt; 1646 1646 } 1647 1647 1648 1648 *ph = prt; 1649 1649 } … … 1657 1657 1658 1658 h = rasVerifyTrackHandle (h); 1659 1659 1660 1660 if (h) 1661 1661 { … … 1664 1664 { 1665 1665 RAS_OBJECT_INFO *iter = h->objfirst; 1666 1666 1667 1667 rasRemoveObjectInfo (iter); 1668 1668 1669 1669 rasFree (iter); 1670 1670 } 1671 1671 1672 1672 /* Remove the track record */ 1673 1673 if (h->next) … … 1680 1680 rasdata.lasttrack = h->prev; 1681 1681 } 1682 1682 1683 1683 if (h->prev) 1684 1684 { … … 1691 1691 } 1692 1692 } 1693 1693 1694 1694 EXIT_RAS (); 1695 1695 } … … 1700 1700 { 1701 1701 ENTER_RAS_RET (h, 0); 1702 1702 1703 1703 struct _RAS_OBJECT_INFO *pinfo_next = NULL; 1704 1704 1705 1705 struct _RAS_OBJECT_INFO *pinfo = rasSearchObject (h, objhandle, &pinfo_next); 1706 1706 1707 1707 // rasLog ("Object added: handle = %8.8X\n", objhandle); 1708 1708 1709 1709 if (pinfo != NULL) 1710 1710 { … … 1715 1715 */ 1716 1716 rasIncUseCount (pinfo); 1717 1717 1718 1718 /* log this event */ 1719 1719 rasLog ("Dublicate object added: handle = %8.8X\n", objhandle); … … 1722 1722 rasLogInternal ("Added object content:\n"); 1723 1723 rasCallLogObjectContent (h, &ctx, pinfo->objident, objhandle, objdata, cbobjdata, rasLogExternal); 1724 1724 1725 1725 rasLogInternal ("Existing object content:\n"); 1726 1726 rasCallLogObjectContent (h, &ctx, pinfo->objident, objhandle, pinfo->objdata, pinfo->cbobjdata, rasLogExternal); 1727 1727 1728 1728 if (rasCallCompareObjectContent (h, &ctx, objhandle, objdata, cbobjdata, pinfo->objdata, pinfo->cbobjdata) != 0) 1729 1729 { … … 1734 1734 else 1735 1735 { 1736 pinfo = (RAS_OBJECT_INFO *)rasAlloc (sizeof (RAS_OBJECT_INFO) - sizeof (RAS_OBJECT_INFO::userdata) 1737 + h->cbuserdata 1736 pinfo = (RAS_OBJECT_INFO *)rasAlloc (sizeof (RAS_OBJECT_INFO) - sizeof (RAS_OBJECT_INFO::userdata) 1737 + h->cbuserdata 1738 1738 + (objdata? cbobjdata: 0)); 1739 1739 if (pinfo) 1740 1740 { 1741 1741 rasInitObjectInfo (pinfo, h, objhandle, objdata, cbobjdata); 1742 1742 1743 1743 int rc = rasAddObjectInfo (pinfo, h, pinfo_next); 1744 1744 1745 1745 if (rc != NO_ERROR) 1746 1746 { 1747 rasFree (pinfo); 1747 rasFree (pinfo); 1748 1748 pinfo = NULL; 1749 1749 } … … 1752 1752 1753 1753 EXIT_RAS (); 1754 1754 1755 1755 if (pinfo) 1756 1756 { 1757 1757 return pinfo->objident; 1758 1758 } 1759 1759 1760 1760 return 0; 1761 1761 } … … 1764 1764 { 1765 1765 ENTER_RAS (h); 1766 1766 1767 1767 // rasLog ("Object to remove: handle = %8.8X\n", objhandle); 1768 1768 1769 1769 struct _RAS_OBJECT_INFO *pinfo = rasSearchObject (h, objhandle, NULL); 1770 1770 1771 1771 // rasLog ("Objects pinfo = %8.8X\n", pinfo); 1772 1772 1773 1773 if (pinfo != NULL) 1774 1774 { … … 1776 1776 { 1777 1777 rasRemoveObjectInfo (pinfo); 1778 1778 1779 1779 rasFree (pinfo); 1780 1780 } 1781 1781 } 1782 1782 1783 1783 EXIT_RAS (); 1784 1784 } 1785 1785 1786 1786 1787 1787 void WIN32API RasQueryObjectUserData (RAS_TRACK_HANDLE h, ULONG objident, void *pdata, ULONG cbdata, ULONG *pcbdataret) 1788 1788 { 1789 1789 ENTER_RAS (h); 1790 1790 1791 1791 struct _RAS_OBJECT_INFO *pinfo = rasSearchObject2 (h, objident); 1792 1792 1793 1793 if (pinfo) 1794 1794 { … … 1797 1797 cbdata = pinfo->h->cbuserdata; 1798 1798 } 1799 1799 1800 1800 memcpy (pdata, &pinfo->userdata, cbdata); 1801 1801 } … … 1804 1804 cbdata = 0; 1805 1805 } 1806 1806 1807 1807 EXIT_RAS (); 1808 1808 1809 1809 if (pcbdataret) 1810 1810 { 1811 1811 *pcbdataret = cbdata; 1812 1812 } 1813 1813 1814 1814 return; 1815 1815 } … … 1818 1818 { 1819 1819 ENTER_RAS (h); 1820 1820 1821 1821 struct _RAS_OBJECT_INFO *pinfo = rasSearchObject2 (h, objident); 1822 1822 1823 1823 if (pinfo) 1824 1824 { … … 1827 1827 cbdata = pinfo->h->cbuserdata; 1828 1828 } 1829 1829 1830 1830 memcpy (&pinfo->userdata, pdata, cbdata); 1831 1831 } … … 1834 1834 cbdata = 0; 1835 1835 } 1836 1836 1837 1837 EXIT_RAS (); 1838 1838 1839 1839 if (pcbdataret) 1840 1840 { 1841 1841 *pcbdataret = cbdata; 1842 1842 } 1843 1843 1844 1844 return; 1845 1845 } 1846 1846 1847 1847 1848 void WIN32API RasLog (c har *fmt, ...)1848 void WIN32API RasLog (const char *fmt, ...) 1849 1849 { 1850 1850 ENTER_RAS (NO_HANDLE); 1851 1851 1852 1852 va_list args; 1853 1853 1854 1854 va_start (args, fmt); 1855 1855 1856 1856 rasLogInternalV (NULL, fmt, args); 1857 1857 1858 1858 va_end (args); 1859 1859 1860 1860 EXIT_RAS (); 1861 1861 } 1862 1862 1863 void WIN32API RasLogNoEOL (c har *fmt, ...)1863 void WIN32API RasLogNoEOL (const char *fmt, ...) 1864 1864 { 1865 1865 va_list args; 1866 1866 1867 1867 ENTER_RAS (NO_HANDLE); 1868 1868 1869 1869 va_start (args, fmt); 1870 1870 1871 1871 ULONG noeolstate = rasdata.fNoEOL; 1872 1872 1873 1873 rasdata.fNoEOL = 1; 1874 1874 1875 1875 rasLogInternalV (NULL, fmt, args); 1876 1876 1877 1877 rasdata.fNoEOL = noeolstate; 1878 1878 1879 1879 va_end (args); 1880 1880 1881 1881 EXIT_RAS (); 1882 1882 } … … 1885 1885 { 1886 1886 ENTER_RAS (NO_HANDLE); 1887 1887 1888 1888 EXIT_RAS (); 1889 1889 } 1890 1890 1891 1891 void WIN32API RasLogObjects (RAS_TRACK_HANDLE h, ULONG flags) 1892 1892 { 1893 1893 ENTER_RAS (h); 1894 1894 1895 1895 rasLogInternal ("[%s] objects", h->objname); 1896 1896 1897 1897 if (h->fMemory) 1898 1898 { … … 1904 1904 } 1905 1905 } 1906 1906 1907 1907 RAS_OBJECT_INFO *iter = h->objfirst; 1908 1908 1909 1909 int count = 0; 1910 1910 ULONG cb = 0; // count total memory allocated if fMemory is set 1911 1911 1912 1912 while (iter) 1913 1913 { … … 1916 1916 cb += iter->cbobjdata; 1917 1917 } 1918 1918 1919 1919 if (flags & RAS_FLAG_LOG_OBJECTS) 1920 1920 { … … 1926 1926 { 1927 1927 rasLogInternal (" handle = %8.8X\n", iter->objhandle); 1928 1928 1929 1929 if (h->fLogObjectContent) 1930 1930 { … … 1933 1933 } 1934 1934 } 1935 1935 1936 1936 count++; 1937 1937 1938 1938 iter = iter->next; 1939 1939 } 1940 1940 1941 1941 rasLogInternal ("%d [%s] objects", count, h->objname); 1942 1942 1943 1943 if (h->fMemory && count > 0) 1944 1944 { 1945 1945 rasLogInternal ("%d bytes allocated", cb); 1946 1946 } 1947 1947 1948 1948 EXIT_RAS (); 1949 1949 1950 1950 return; 1951 1951 } … … 1954 1954 { 1955 1955 ENTER_RAS (h); 1956 1956 1957 1957 RAS_OBJECT_INFO *iter = h->objfirst; 1958 1958 1959 1959 int count = 0; 1960 1960 ULONG cb = 0; // count total memory allocated if fMemory is set 1961 1961 1962 1962 while (iter) 1963 1963 { … … 1966 1966 cb += iter->cbobjdata; 1967 1967 } 1968 1968 1969 1969 count++; 1970 1970 1971 1971 iter = iter->next; 1972 1972 } 1973 1973 1974 1974 if (h->fMemory) 1975 1975 { … … 1979 1979 } 1980 1980 } 1981 1981 1982 1982 if (pcount) 1983 1983 { 1984 1984 *pcount = count; 1985 1985 } 1986 1986 1987 1987 EXIT_RAS (); 1988 1988 1989 1989 return; 1990 1990 } … … 1993 1993 { 1994 1994 ENTER_RAS (NO_HANDLE); 1995 1995 1996 1996 va_list args; 1997 1997 1998 1998 va_start (args, fmt); 1999 1999 2000 2000 rasLogInternalV (hchannel, fmt, args); 2001 2001 2002 2002 va_end (args); 2003 2003 2004 2004 EXIT_RAS (); 2005 2005 } … … 2008 2008 { 2009 2009 va_list args; 2010 2010 2011 2011 ENTER_RAS (NO_HANDLE); 2012 2012 2013 2013 va_start (args, fmt); 2014 2014 2015 2015 ULONG noeolstate = rasdata.fNoEOL; 2016 2016 2017 2017 rasdata.fNoEOL = 1; 2018 2018 2019 2019 rasLogInternalV (hchannel, fmt, args); 2020 2020 2021 2021 rasdata.fNoEOL = noeolstate; 2022 2022 2023 2023 va_end (args); 2024 2024 2025 2025 EXIT_RAS (); 2026 2026 } … … 2029 2029 { 2030 2030 ENTER_RAS (NO_HANDLE); 2031 2031 2032 2032 EXIT_RAS (); 2033 2033 } … … 2047 2047 { 2048 2048 ENTER_RAS_RET (NO_HANDLE, ERROR_GEN_FAILURE); 2049 2049 2050 2050 int rc = NO_ERROR; 2051 2051 2052 2052 RasLogChannel *prlc = (RasLogChannel *)rasAlloc (sizeof (RasLogChannel)); 2053 2053 2054 2054 if (!prlc) 2055 2055 { … … 2059 2059 { 2060 2060 rc = rasOpenLogChannel (env_loghandler, prlc, filename); 2061 2061 2062 2062 if (rc != NO_ERROR) 2063 2063 { … … 2069 2069 } 2070 2070 } 2071 2071 2072 2072 EXIT_RAS (); 2073 2073 2074 2074 return rc; 2075 2075 } 2076 2076 2077 2077 void WIN32API RasWriteLogChannel (RAS_LOG_CHANNEL_H hchannel, const char *msg, ULONG length) 2078 2078 { 2079 2079 ENTER_RAS (NO_HANDLE); 2080 2080 2081 2081 if (length > 0) 2082 2082 { 2083 2083 RasLogChannel *prlc = (RasLogChannel *)hchannel; 2084 2084 2085 2085 prlc->pfnWriteLog (prlc->hlogfile, (char *)msg, length); 2086 2086 } 2087 2087 2088 2088 EXIT_RAS (); 2089 2089 } 2090 2090 2091 2091 void WIN32API RasCloseLogChannel (RAS_LOG_CHANNEL_H hchannel) 2092 2092 { 2093 2093 ENTER_RAS (NO_HANDLE); 2094 2094 2095 2095 RasLogChannel *prlc = (RasLogChannel *)hchannel; 2096 2096 2097 2097 rasCloseLogChannel (prlc); 2098 2098 2099 2099 rasFree (prlc); 2100 2100 2101 2101 EXIT_RAS (); 2102 2102 } 2103 2103 2104 2104 2105 2105 void WIN32API RasEntry (ULONG ulEvent, void *p, ULONG cb) 2106 2106 { 2107 2107 ENTER_RAS (NO_HANDLE); 2108 2108 2109 2109 if (rasdata.pet.RasEntry) 2110 2110 { 2111 2111 rasdata.pet.RasEntry (ulEvent, p, cb); 2112 2112 } 2113 2113 2114 2114 EXIT_RAS (); 2115 2115 } … … 2140 2140 { 2141 2141 ENTER_RAS (h); 2142 2142 2143 2143 if (h->fMemory && size > 0) 2144 2144 { … … 2146 2146 h->cbTotalAllocated += size; 2147 2147 } 2148 2148 2149 2149 EXIT_RAS (); 2150 2150 } 2151 2151 2152 2152 void WIN32API RasTrackMemRealloc (RAS_TRACK_HANDLE h, ULONG oldsize, ULONG newsize) 2153 2153 { 2154 2154 ENTER_RAS (h); 2155 2155 2156 2156 if (h->fMemory) 2157 2157 { … … 2162 2162 } 2163 2163 } 2164 2164 2165 2165 EXIT_RAS (); 2166 2166 } 2167 2167 2168 2168 void WIN32API RasTrackMemFree (RAS_TRACK_HANDLE h, ULONG size) 2169 2169 { 2170 2170 ENTER_RAS (h); 2171 2171 2172 2172 if (h->fMemory && size > 0) 2173 2173 { … … 2175 2175 h->cbTotalAllocated -= size; 2176 2176 } 2177 2177 2178 2178 EXIT_RAS (); 2179 2179 } 2180 2180 -
branches/gcc-kmk/src/kernel32/dbglog.cpp
r21343 r21717 93 93 /* arguments. */ 94 94 /* ----------------------------------------------------------------- */ 95 int SYSTEM WriteLog(c har *f, ...)95 int SYSTEM WriteLog(const char *f, ...) 96 96 { 97 97 TIB *ptib; /* process/thread id structures */ … … 305 305 } 306 306 307 int SYSTEM WriteLog(c har *tekst, ...)307 int SYSTEM WriteLog(const char *tekst, ...) 308 308 { 309 309 USHORT sel = RestoreOS2FS(); … … 348 348 sprintf(szLogFile, "%s%d.log", pszLogBase, loadNr); 349 349 flog = fopen(szLogFile, "w"); 350 if(flog == NULL) 350 if(flog == NULL) 351 351 {//probably running exe on readonly device 352 352 sprintf(szLogFile, "%sodin32_%d.log", kernel32Path, loadNr); … … 385 385 if(logSocket == -1) { 386 386 #endif 387 if(teb) 387 if(teb) 388 388 { 389 389 ULONG ulCallDepth; … … 393 393 ulCallDepth = 0; 394 394 #endif 395 395 396 396 teb->o.odin.logfile = (DWORD)flog; 397 397 398 398 #ifdef LOG_TIME 399 399 if(sel == 0x150b && fSwitchTIBSel) 400 fprintf(flog, 400 fprintf(flog, 401 401 "t%02d (%3d): (%x) (FS=150B) ", 402 402 LOWORD(teb->o.odin.threadId), 403 403 ulCallDepth, 404 404 GetTickCount()); 405 else 406 fprintf(flog, 405 else 406 fprintf(flog, 407 407 "t%02d (%3d): (%x) ", 408 408 LOWORD(teb->o.odin.threadId), … … 410 410 GetTickCount()); 411 411 #else 412 if(sel == 0x150b && fSwitchTIBSel) 413 fprintf(flog, 412 if(sel == 0x150b && fSwitchTIBSel) 413 fprintf(flog, 414 414 #ifdef SHOW_FPU_CONTROLREG 415 415 "t%02d (%3d)(%3x): ", … … 422 422 ulCallDepth); 423 423 #endif 424 else 425 fprintf(flog, 424 else 425 fprintf(flog, 426 426 #ifdef SHOW_FPU_CONTROLREG 427 427 "t%02d (%3d)(%3x): ", … … 450 450 int prefixlen = 0; 451 451 452 if(teb) 452 if(teb) 453 453 { 454 454 ULONG ulCallDepth; … … 459 459 #endif 460 460 #ifdef LOG_TIME 461 if(sel == 0x150b && fSwitchTIBSel) 461 if(sel == 0x150b && fSwitchTIBSel) 462 462 sprintf(logbuffer, "t%02d (%3d): %x (FS=150B) ", 463 463 LOWORD(teb->o.odin.threadId), ulCallDepth, GetTickCount()); 464 else 464 else 465 465 sprintf(logbuffer, "t%02d (%3d): %x ", 466 466 LOWORD(teb->o.odin.threadId), ulCallDepth, GetTickCount()); 467 467 #else 468 if(sel == 0x150b && fSwitchTIBSel) 468 if(sel == 0x150b && fSwitchTIBSel) 469 469 sprintf(logbuffer, "t%02d (%3d): (FS=150B) ", 470 470 LOWORD(teb->o.odin.threadId), ulCallDepth); 471 else 471 else 472 472 sprintf(logbuffer, "t%02d (%3d): ", 473 473 LOWORD(teb->o.odin.threadId), ulCallDepth); … … 497 497 if(tekst[strlen(tekst)-1] != '\n') 498 498 fprintf(flog, "\n"); 499 #if 0 499 #if 0 500 500 if (teb && LOWORD(teb->o.odin.threadId) > 1) 501 501 { … … 514 514 break; 515 515 } 516 516 517 517 if ((ULONG)pframe < getESP()) 518 518 { … … 554 554 //****************************************************************************** 555 555 //****************************************************************************** 556 int SYSTEM WriteLogNoEOL(c har *tekst, ...)556 int SYSTEM WriteLogNoEOL(const char *tekst, ...) 557 557 { 558 558 USHORT sel = RestoreOS2FS(); … … 612 612 //****************************************************************************** 613 613 //****************************************************************************** 614 int SYSTEM WritePrivateLog(void *logfile, c har *tekst, ...)614 int SYSTEM WritePrivateLog(void *logfile, const char *tekst, ...) 615 615 { 616 616 USHORT sel = RestoreOS2FS(); -
branches/gcc-kmk/src/kernel32/exceptions.cpp
r21662 r21717 756 756 } 757 757 758 P SZpszExceptionName = "<unknown>"; /* points to name/type excpt */758 PCSZ pszExceptionName = "<unknown>"; /* points to name/type excpt */ 759 759 APIRET rc = XCPT_CONTINUE_SEARCH; /* excpt-dep. code */ 760 760 BOOL fExcptSoftware = FALSE; /* software/hardware gen. exceptn */ … … 1181 1181 1182 1182 if(lpszExeName) { 1183 DosWrite(hFile, "\n", 2, &ulBytesWritten);1183 DosWrite(hFile, (PVOID)"\n", 2, &ulBytesWritten); 1184 1184 DosWrite(hFile, lpszExeName, strlen(lpszExeName), &ulBytesWritten); 1185 DosWrite(hFile, "\n", 2, &ulBytesWritten);1185 DosWrite(hFile, (PVOID)"\n", 2, &ulBytesWritten); 1186 1186 } 1187 1187 } -
branches/gcc-kmk/src/kernel32/exceptstackdump.cpp
r21611 r21717 30 30 #include "dbglocal.h" 31 31 32 int SYSTEM EXPORT WriteLogNoEOL(c har *tekst, ...);32 int SYSTEM EXPORT WriteLogNoEOL(const char *tekst, ...); 33 33 34 34 #define FIX64KLIMIT -
branches/gcc-kmk/src/kernel32/handlenames.cpp
r21302 r21717 27 27 #define INCL_DOSSEMAPHORES 28 28 #define INCL_DOSERRORS 29 #include <os2 .h>29 #include <os2wrap.h> 30 30 31 31 #include <stdlib.h> … … 53 53 PSZ pszTarget; 54 54 ULONG ulTargetLength; 55 55 56 56 // the alias prefix 57 57 PSZ pszSymbolicLink; … … 65 65 VMutex mtxHandleNameMgr; 66 66 CLinearList* pSymbolicLinks; 67 68 PHANDLENAME findSymbolicLink(P SZ pszSymbolicLink,67 68 PHANDLENAME findSymbolicLink(PCSZ pszSymbolicLink, 69 69 BOOL fCaseInsensitive); 70 71 PHANDLENAME findSymbolicLinkExact(P SZ pszSymbolicLink);72 70 71 PHANDLENAME findSymbolicLinkExact(PCSZ pszSymbolicLink); 72 73 73 public: 74 74 HandleNames(void); 75 75 ~HandleNames(); 76 77 BOOL addSymbolicLink(P SZ pszSymbolicLink,78 P SZ pszTarget);79 80 BOOL removeSymbolicLink(P SZ pszSymbolicLink);81 82 BOOL removeTarget(P SZ pszTarget);83 84 BOOL resolveName(P SZ pszName,85 PSZ pszTarget, 86 ULONG ulTargetLength, 76 77 BOOL addSymbolicLink(PCSZ pszSymbolicLink, 78 PCSZ pszTarget); 79 80 BOOL removeSymbolicLink(PCSZ pszSymbolicLink); 81 82 BOOL removeTarget(PCSZ pszTarget); 83 84 BOOL resolveName(PCSZ pszName, 85 PSZ pszTarget, 86 ULONG ulTargetLength, 87 87 BOOL fCaseInsensitive); 88 88 }; … … 107 107 * Name : HandleNames::HandleNames 108 108 * Purpose : Constructor for handle name mapper 109 * Parameters: 110 * Variables : 111 * Result : 109 * Parameters: 110 * Variables : 111 * Result : 112 112 * Remark : 113 113 * Status : … … 127 127 * Name : HandleNames::~HandleNames 128 128 * Purpose : destructor for handle name mapper 129 * Parameters: 130 * Variables : 131 * Result : 129 * Parameters: 130 * Variables : 131 * Result : 132 132 * Remark : 133 133 * Status : … … 148 148 * BOOL fCaseInsensitive - TRUE for a case-insensitive lookup 149 149 * Variables : 150 * Result : 150 * Result : 151 151 * Remark : The comparison here is not meant to be "identity" but 152 152 * "startsWith" because for the name resolver, the first … … 161 161 *****************************************************************************/ 162 162 163 PHANDLENAME HandleNames::findSymbolicLink(P SZ pszSymbolicLink,163 PHANDLENAME HandleNames::findSymbolicLink(PCSZ pszSymbolicLink, 164 164 BOOL fCaseInsensitive) 165 165 { … … 170 170 PHANDLENAME pHandleName = (PHANDLENAME)pLE->pObject; 171 171 int cch = pHandleName->ulSymbolicLinkLength; //strlen(pHandleName->pszSymbolicLink); 172 172 173 173 /* pszSymbolicLink must end a path component at cch. */ 174 174 if ( cch <= cchSymbolicLink … … 186 186 } 187 187 } 188 188 189 189 // skip to the next entry 190 190 pLE = pSymbolicLinks->getNext(pLE); 191 191 } 192 192 193 193 // not found 194 194 return NULL; … … 202 202 * BOOL fCaseInsensitive - TRUE for a case-insensitive lookup 203 203 * Variables : 204 * Result : 204 * Result : 205 205 * Remark : The comparison here is not meant to be "identity" but 206 206 * "startsWith" because for the name resolver, the first … … 215 215 *****************************************************************************/ 216 216 217 PHANDLENAME HandleNames::findSymbolicLinkExact(P SZ pszSymbolicLink)217 PHANDLENAME HandleNames::findSymbolicLinkExact(PCSZ pszSymbolicLink) 218 218 { 219 219 PLINEARLISTENTRY pLE = pSymbolicLinks->getFirst(); … … 221 221 { 222 222 PHANDLENAME pHandleName = (PHANDLENAME)pLE->pObject; 223 223 224 224 if (strcmp(pHandleName->pszSymbolicLink, pszSymbolicLink) == 0) 225 225 return pHandleName; 226 226 227 227 // skip to the next entry 228 228 pLE = pSymbolicLinks->getNext(pLE); 229 229 } 230 230 231 231 // not found 232 232 return NULL; … … 248 248 *****************************************************************************/ 249 249 250 BOOL HandleNames::addSymbolicLink(P SZ pszSymbolicLink,251 P SZ pszTarget)250 BOOL HandleNames::addSymbolicLink(PCSZ pszSymbolicLink, 251 PCSZ pszTarget) 252 252 { 253 253 BOOL rc = TRUE; 254 254 255 255 mtxHandleNameMgr.enter(); 256 256 257 257 // 1 - find symbolic link with same name 258 258 PHANDLENAME pHandleName = findSymbolicLinkExact(pszSymbolicLink); 259 260 // 2 - if found 259 260 // 2 - if found 261 261 if (NULL != pHandleName) 262 262 { … … 264 264 if (strcmp(pszTarget, pHandleName->pszTarget) == 0) 265 265 rc = TRUE; 266 266 267 267 // 2.2 - and targets are identical, return TRUE 268 268 else … … 297 297 pHandleName->ulTargetLength = strlen(pszTarget); 298 298 pHandleName->ulSymbolicLinkLength = strlen(pszSymbolicLink); 299 299 300 300 // OK, finally add to the list 301 301 pSymbolicLinks->addFirst(pHandleName); … … 304 304 } 305 305 } 306 306 307 307 mtxHandleNameMgr.leave(); 308 308 309 309 return rc; 310 310 } … … 312 312 313 313 /***************************************************************************** 314 * Name : 315 * Purpose : 316 * Parameters: 314 * Name : 315 * Purpose : 316 * Parameters: 317 317 * Variables : 318 318 * Result : TRUE if successful, FALSE if otherwise … … 323 323 *****************************************************************************/ 324 324 325 BOOL HandleNames::removeSymbolicLink(P SZ pszSymbolicLink)325 BOOL HandleNames::removeSymbolicLink(PCSZ pszSymbolicLink) 326 326 { 327 327 BOOL rc = TRUE; 328 328 329 329 mtxHandleNameMgr.enter(); 330 330 331 331 // 1 - find symbolic name 332 332 PHANDLENAME pHandleName = findSymbolicLinkExact(pszSymbolicLink); … … 337 337 // 2 - remove the link 338 338 pSymbolicLinks->removeObject(pHandleName); 339 339 340 340 if (NULL != pHandleName->pszSymbolicLink ) 341 341 free( pHandleName->pszSymbolicLink ); 342 342 343 343 if (NULL != pHandleName->pszTarget ) 344 344 free( pHandleName->pszTarget ); 345 345 346 346 free( pHandleName ); 347 347 } 348 348 349 349 mtxHandleNameMgr.leave(); 350 350 351 351 return rc; 352 352 } … … 365 365 *****************************************************************************/ 366 366 367 BOOL HandleNames::removeTarget(P SZ pszTarget)367 BOOL HandleNames::removeTarget(PCSZ pszTarget) 368 368 { 369 369 BOOL rc = FALSE; 370 370 371 371 mtxHandleNameMgr.enter(); 372 372 373 373 // iterate over all registered symbolic links 374 374 PLINEARLISTENTRY pLE = pSymbolicLinks->getFirst(); … … 376 376 { 377 377 PHANDLENAME pHandleName = (PHANDLENAME)pLE->pObject; 378 378 379 379 // check the name 380 380 if (strcmp(pszTarget, pHandleName->pszTarget) == 0) 381 381 { 382 382 pSymbolicLinks->removeElement(pLE); 383 383 384 384 // at least one removal succeeded 385 385 rc = TRUE; 386 386 } 387 387 } 388 388 389 389 mtxHandleNameMgr.leave(); 390 390 391 391 return rc; 392 392 } … … 403 403 * Variables : 404 404 * Result : FALSE if name was not modified, TRUE if name was resolved 405 * Remark : This is a very easy, cheesy implementation of a pathname 405 * Remark : This is a very easy, cheesy implementation of a pathname 406 406 * cracker. Should be sufficient at the moment though. 407 407 * Status : … … 410 410 *****************************************************************************/ 411 411 412 BOOL HandleNames::resolveName(P SZ pszName,413 PSZ pszTarget, 412 BOOL HandleNames::resolveName(PCSZ pszName, 413 PSZ pszTarget, 414 414 ULONG ulTargetLength, 415 415 BOOL fCaseInsensitive) 416 416 { 417 417 BOOL rc = FALSE; 418 418 419 419 mtxHandleNameMgr.enter(); 420 420 421 421 // scan through the names (case-insensitive) 422 422 PHANDLENAME pHandleName = findSymbolicLink(pszName, fCaseInsensitive); … … 425 425 // rebuild the target name 426 426 int iNameLength = strlen(pszName); 427 427 428 428 // first copy the resolved target name fragment 429 429 strncpy(pszTarget, 430 430 pHandleName->pszTarget, 431 431 ulTargetLength); 432 432 433 433 // now append the rest of the specified name with the 434 434 // now resolved symbolic cut away … … 437 437 pszName + pHandleName->ulSymbolicLinkLength, 438 438 ulTargetLength - pHandleName->ulTargetLength); 439 439 440 440 // tell caller the name has been resolved 441 441 // (is different from the source name) 442 442 rc = TRUE; 443 443 } 444 444 445 445 mtxHandleNameMgr.leave(); 446 446 447 447 return rc; 448 448 } … … 454 454 * Exported Wrapper Functions 455 455 *****************************************************************************/ 456 457 BOOL HandleNamesResolveName(P SZ pszName,456 457 BOOL HandleNamesResolveName(PCSZ pszName, 458 458 PSZ pszTarget, 459 459 ULONG ulTargetLength, … … 467 467 468 468 469 BOOL HandleNamesAddSymbolicLink(P SZ pszSymbolicLink,470 P SZ pszTarget)469 BOOL HandleNamesAddSymbolicLink(PCSZ pszSymbolicLink, 470 PCSZ pszTarget) 471 471 { 472 472 return pHandleNameMgr->addSymbolicLink(pszSymbolicLink, 473 473 pszTarget); 474 474 } 475 476 477 BOOL HandleNamesRemoveSymbolicLink(P SZ pszSymbolicLink)475 476 477 BOOL HandleNamesRemoveSymbolicLink(PCSZ pszSymbolicLink) 478 478 { 479 479 return pHandleNameMgr->removeSymbolicLink(pszSymbolicLink); 480 480 } 481 482 483 BOOL HandleNamesRemoveTarget(P SZ pszTarget)481 482 483 BOOL HandleNamesRemoveTarget(PCSZ pszTarget) 484 484 { 485 485 return pHandleNameMgr->removeTarget(pszTarget); -
branches/gcc-kmk/src/kernel32/handlenames.h
r7441 r21717 17 17 * Exported Wrapper Functions 18 18 *****************************************************************************/ 19 20 BOOL HandleNamesResolveName(P SZ pszName,21 P SZ pszTarget,19 20 BOOL HandleNamesResolveName(PCSZ pszName, 21 PCSZ pszTarget, 22 22 ULONG ulTargetLength, 23 23 BOOL fCaseInsensitive); 24 24 25 BOOL HandleNamesAddSymbolicLink(P SZ pszSymbolicLink,26 P SZ pszTarget);25 BOOL HandleNamesAddSymbolicLink(PCSZ pszSymbolicLink, 26 PCSZ pszTarget); 27 27 28 BOOL HandleNamesRemoveSymbolicLink(P SZ pszSymbolicLink);28 BOOL HandleNamesRemoveSymbolicLink(PCSZ pszSymbolicLink); 29 29 30 BOOL HandleNamesRemoveTarget(P SZ pszTarget);30 BOOL HandleNamesRemoveTarget(PCSZ pszTarget); 31 31 32 32 -
branches/gcc-kmk/src/kernel32/hmdevice.h
r21302 r21717 451 451 452 452 /* register a new device with the handle manager */ 453 DWORD HMDeviceRegister(LP STR pszDeviceName,453 DWORD HMDeviceRegister(LPCSTR pszDeviceName, 454 454 HMDeviceHandler *pDeviceHandler); 455 455 456 DWORD HMDeviceRegisterEx(LP STR pszDeviceName,456 DWORD HMDeviceRegisterEx(LPCSTR pszDeviceName, 457 457 HMDeviceHandler *pDeviceHandler, 458 458 VOID *pDevData); -
branches/gcc-kmk/src/kernel32/kdbhookhlp.cpp
r10382 r21717 34 34 //****************************************************************************** 35 35 //****************************************************************************** 36 c har *WIN32API QueryCustomStdClassName()36 const char *WIN32API QueryCustomStdClassName() 37 37 { 38 38 return ODIN_WIN32_STDCLASS; -
branches/gcc-kmk/src/user32/pmwindow.cpp
r21556 r21717 2747 2747 //****************************************************************************** 2748 2748 //****************************************************************************** 2749 c har *WIN32API QueryCustomStdClassName()2749 const char *WIN32API QueryCustomStdClassName() 2750 2750 { 2751 2751 return WIN32_STDCLASS;
Note:
See TracChangeset
for help on using the changeset viewer.