MmFreeNonCachedMemory падает

Тема в разделе "WASM.NT.KERNEL", создана пользователем drem1lin, 24 ноя 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Пытаюсь вернуть строку из функции через параметр, в функции выделяю память с помощью MmAllocateNonCachedMemory, значение получаю, при попытке освободить память получаю BSOD. Что не так делаю?

    Код (Text):
    1. PWCHAR wcRecentPath = NULL;
    2.              CreatePathToUserRecentFolder(UserName,&wcRecentPath);
    3.     IFDEBUG(DbgPrint("wcRecentPath 0x%x\n",wcRecentPath));
    4.              if( MmIsAddressValid ( wcRecentPath ) )
    5.             {
    6.         [b]MmFreeNonCachedMemory(wcRecentPath,MAX_PATH);[/b]//!!!!!!!!!!!!Тут падает
    7.             }
    CreatePathToUserRecentFolder:
    Код (Text):
    1. VOID CreatePathToUserRecentFolder( IN PWCHAR   UserName,OUT PWCHAR* Path)
    2. {
    3.     PWCHAR usTempString;
    4.     DWORD dwStrOffset = 0,dwTmp =0;
    5.     usTempString =(PWCHAR) MmAllocateNonCachedMemory(MAX_PATH);
    6.     /*формирование строки*/
    7.     *Path = usTempString;
    8.     IFDEBUG(DbgPrint("usTempString 0x%x\n",usTempString));
    9. }
    При сравнении значения wcRecentPath и UsTempString совпадают. Почему я не могу освободить память?

    Код (Text):
    1. UserName Admin
    2. UserName 0xf9fd2000
    3. UserName 0xf9fd2000
    4.  
    5. *** Fatal System Error: 0x00000050
    6.                        (0xF9FD2000,0x00000000,0x8050D5C7,0x00000000)
    7.  
    8. Break instruction exception - code 80000003 (first chance)
    9.  
    10. A fatal system error has occurred.
    11. Debugger entered on first try; Bugcheck callbacks have not been invoked.
    12.  
    13. A fatal system error has occurred.
    14.  
    15. Connected to Windows XP 2600 x86 compatible target at (Wed Nov 24 13:58:13.562 2010 (GMT+3)), ptr64 FALSE
    16. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntkrnlmp.exe -
    17. Loading Kernel Symbols
    18. ...............................................................
    19. ........................................................
    20. Loading User Symbols
    21.  
    22. Loading unloaded module list
    23. ...........
    24. *******************************************************************************
    25. *                                                                             *
    26. *                        Bugcheck Analysis                                    *
    27. *                                                                             *
    28. *******************************************************************************
    29.  
    30. Use !analyze -v to get detailed debugging information.
    31.  
    32. BugCheck 50, {f9fd2000, 0, 8050d5c7, 0}
    33.  
    34. ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
    35.  
    36. *** ERROR: Module load completed but symbols could not be loaded for mssmbios.sys
    37. *************************************************************************
    38. ***                                                                   ***
    39. ***                                                                   ***
    40. ***    Your debugger is not using the correct symbols                 ***
    41. ***                                                                   ***
    42. ***    In order for this command to work properly, your symbol path   ***
    43. ***    must point to .pdb files that have full type information.      ***
    44. ***                                                                   ***
    45. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    46. ***    contain the required information.  Contact the group that      ***
    47. ***    provided you with these symbols if you need this command to    ***
    48. ***    work.                                                          ***
    49. ***                                                                   ***
    50. ***    Type referenced: nt!_KPRCB                                     ***
    51. ***                                                                   ***
    52. *************************************************************************
    53. *************************************************************************
    54. ***                                                                   ***
    55. ***                                                                   ***
    56. ***    Your debugger is not using the correct symbols                 ***
    57. ***                                                                   ***
    58. ***    In order for this command to work properly, your symbol path   ***
    59. ***    must point to .pdb files that have full type information.      ***
    60. ***                                                                   ***
    61. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    62. ***    contain the required information.  Contact the group that      ***
    63. ***    provided you with these symbols if you need this command to    ***
    64. ***    work.                                                          ***
    65. ***                                                                   ***
    66. ***    Type referenced: nt!_KPRCB                                     ***
    67. ***                                                                   ***
    68. *************************************************************************
    69. Probably caused by : RecentMon.sys ( RecentMon!OpenRecentDirectory+cd )
    70.  
    71. Followup: MachineOwner
    72. ---------
    73.  
    74. nt!DbgBreakPointWithStatus+0x4:
    75. 804e30d9 cc              int     3
    76. 0: kd> !analyze -v
    77. *******************************************************************************
    78. *                                                                             *
    79. *                        Bugcheck Analysis                                    *
    80. *                                                                             *
    81. *******************************************************************************
    82.  
    83. PAGE_FAULT_IN_NONPAGED_AREA (50)
    84. Invalid system memory was referenced.  This cannot be protected by try-except,
    85. it must be protected by a Probe.  Typically the address is just plain bad or it
    86. is pointing at freed memory.
    87. Arguments:
    88. Arg1: f9fd2000, memory referenced.
    89. Arg2: 00000000, value 0 = read operation, 1 = write operation.
    90. Arg3: 8050d5c7, If non-zero, the instruction address which referenced the bad memory
    91.     address.
    92. Arg4: 00000000, (reserved)
    93.  
    94. Debugging Details:
    95. ------------------
    96.  
    97. ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
    98.  
    99. *************************************************************************
    100. ***                                                                   ***
    101. ***                                                                   ***
    102. ***    Your debugger is not using the correct symbols                 ***
    103. ***                                                                   ***
    104. ***    In order for this command to work properly, your symbol path   ***
    105. ***    must point to .pdb files that have full type information.      ***
    106. ***                                                                   ***
    107. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    108. ***    contain the required information.  Contact the group that      ***
    109. ***    provided you with these symbols if you need this command to    ***
    110. ***    work.                                                          ***
    111. ***                                                                   ***
    112. ***    Type referenced: nt!_KPRCB                                     ***
    113. ***                                                                   ***
    114. *************************************************************************
    115. *************************************************************************
    116. ***                                                                   ***
    117. ***                                                                   ***
    118. ***    Your debugger is not using the correct symbols                 ***
    119. ***                                                                   ***
    120. ***    In order for this command to work properly, your symbol path   ***
    121. ***    must point to .pdb files that have full type information.      ***
    122. ***                                                                   ***
    123. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    124. ***    contain the required information.  Contact the group that      ***
    125. ***    provided you with these symbols if you need this command to    ***
    126. ***    work.                                                          ***
    127. ***                                                                   ***
    128. ***    Type referenced: nt!_KPRCB                                     ***
    129. ***                                                                   ***
    130. *************************************************************************
    131.  
    132. ADDITIONAL_DEBUG_TEXT:  
    133. Use '!findthebuild' command to search for the target build information.
    134. If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.
    135.  
    136. FAULTING_MODULE: 804d7000 nt
    137.  
    138. DEBUG_FLR_IMAGE_TIMESTAMP:  4cecefb6
    139.  
    140. READ_ADDRESS: unable to get nt!MmSpecialPoolStart
    141. unable to get nt!MmSpecialPoolEnd
    142. unable to get nt!MmPoolCodeStart
    143. unable to get nt!MmPoolCodeEnd
    144.  f9fd2000
    145.  
    146. FAULTING_IP:
    147. nt!KeInitializeDeviceQueue+356
    148. 8050d5c7 66833800        cmp     word ptr [eax],0
    149.  
    150. MM_INTERNAL_CODE:  0
    151.  
    152. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    153.  
    154. BUGCHECK_STR:  0x50
    155.  
    156. LAST_CONTROL_TRANSFER:  from 8053721e to 804e30d9
    157.  
    158. STACK_TEXT:  
    159. WARNING: Stack unwind information not available. Following frames may be wrong.
    160. f9eb2214 8053721e 00000003 80703a4c c03e7f48 nt!DbgBreakPointWithStatus+0x4
    161. f9eb25f4 80537832 00000050 f9fd2000 00000000 nt!KeDeregisterBugCheckReasonCallback+0x6c7
    162. f9eb2614 805296be 00000050 f9fd2000 00000000 nt!KeBugCheckEx+0x1b
    163. f9eb2664 804e0f07 00000000 f9fd2000 00000000 nt!KePulseEvent+0xd123
    164. f9eb2688 8051ba6d 80507edd 80508797 f9eb2974 nt!Kei386EoiHelper+0x274d
    165. f9eb2958 80507fbe f9eb2974 f9cfc940 f9eb2c14 nt!wcscat+0x2f2
    166. f9eb2994 80508702 f9eb29d0 00000200 f9cfc940 nt!vsnprintf+0x2f
    167. f9eb2bec 80508793 80508796 ffffffff 00000000 nt!vDbgPrintExWithPrefix+0x82
    168. f9eb2c08 f9cfc61d f9cfc940 f9fd2000 f9fd0000 nt!DbgPrint+0x1a
    169. f9eb2c54 f9cfc68b 8151e528 f9eb2c84 f9cfc0f8 RecentMon!OpenRecentDirectory+0xcd [d:\projects\recentmon\recentmon\recentmonfunc.c @ 126]
    170. f9eb2c60 f9cfc0f8 002c002a f9cfc6f0 c0000035 RecentMon!StartRecentMonitor+0xb [d:\projects\recentmon\recentmon\recentmonfunc.c @ 142]
    171. f9eb2c84 805a3777 8163e2c0 814e6000 00000000 RecentMon!DriverEntry+0xe8 [d:\projects\recentmon\recentmon\recentmon.c @ 46]
    172. f9eb2d54 805ad447 0000072c 00000001 00000000 nt!RtlUpperChar+0x1872
    173. f9eb2d7c 804e29d6 0000072c 00000000 817c7020 nt!MmResetDriverPaging+0x514
    174. f9eb2dac 80576b24 f0713cf4 00000000 00000000 nt!KeRemoveQueue+0x221
    175. f9eb2ddc 804eed86 804e2912 00000001 00000000 nt!PsCreateSystemThread+0x70
    176. 00000000 00000000 00000000 00000000 00000000 nt!KeInitializeTimerEx+0x1eb
    177.  
    178.  
    179. STACK_COMMAND:  kb
    180.  
    181. FOLLOWUP_IP:
    182. RecentMon!OpenRecentDirectory+cd [d:\projects\recentmon\recentmon\recentmonfunc.c @ 126]
    183. f9cfc61d 83c408          add     esp,8
    184.  
    185. FAULTING_SOURCE_CODE:  
    186.    122:     if( MmIsAddressValid ( wcRecentPath ) )
    187.    123:     {
    188.    124:         MmFreeNonCachedMemory(wcRecentPath,MAX_PATH);
    189.    125:     }
    190. >  126:     IFDEBUG(DbgPrint("Recent Folder path %S\n",usRecentFolderPath.Buffer));
    191.    127:
    192.    128:     InitializeObjectAttributes(&DirectoryAttributes,&usRecentFolderPath,OBJ_CASE_INSENSITIVE,NULL,NULL);
    193.    129:     rc = ZwOpenFile(&hPathDirHandle,GENERIC_READ,&DirectoryAttributes,&iosb,FILE_SHARE_READ|FILE_SHARE_WRITE,FILE_DIRECTORY_FILE);
    194.    130:     if (rc!=STATUS_SUCCESS)
    195.    131:     {
    196.  
    197.  
    198. SYMBOL_STACK_INDEX:  9
    199.  
    200. SYMBOL_NAME:  RecentMon!OpenRecentDirectory+cd
    201.  
    202. FOLLOWUP_NAME:  MachineOwner
    203.  
    204. MODULE_NAME: RecentMon
    205.  
    206. IMAGE_NAME:  RecentMon.sys
    207.  
    208. BUCKET_ID:  WRONG_SYMBOLS
    209.  
    210. Followup: MachineOwner
    211. ---------
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А 'DbgPrint("%s")' где-нибудь в коде встречается? Такое ощущение, что вызывается 'DbgPrint("%s")' для строки без завершающего нуля.
     
  3. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    странное ощущение.. можешь описать, почему возникают такие мысли?? дбгпринты есть, но причем тут они?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Падение, если верить стеку, произошло в DbgPrint:
    Код (Text):
    1. f9eb2c08 f9cfc61d f9cfc940 f9fd2000 f9fd0000 nt!DbgPrint+0x1a
    2. f9eb2c54 f9cfc68b 8151e528 f9eb2c84 f9cfc0f8 RecentMon!OpenRecentDirectory+0xcd [d:\projects\recentmon\recentmon\recentmonfunc.c @ 126]
    Инструкция, на которой произошло падение, похожа на инструкцию поиска завершающего нуля:
    Код (Text):
    1. FAULTING_IP:
    2. nt!KeInitializeDeviceQueue+356
    3. 8050d5c7 66833800        cmp     word ptr [eax],0
    Ты не показал, как заполняется usTempString:
    Код (Text):
    1.     usTempString =(PWCHAR) MmAllocateNonCachedMemory(MAX_PATH);
    2.     /*формирование строки*/
    3.     *Path = usTempString;
    Ну и немного психологии :). Тебе наверняка было интересно, как заполнилась строка, вот ты и сделал что-то в духе 'DbgPrint(usTempString)' или 'DbgPrint("%s\n", usTempString)'.

    Если, конечно, предположения верны...
     
  5. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    =)) такое делал, а вот насчет нуля.. скорее всего ты прав=))))
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, не понятно, как инициализируется строка usTempString, может быть там ошибка. Во-вторых, для Unicode-строк в DbgPrint() следует указывать %S, а не %s. Чтобы избежать таких ошибок в будущем, следует использовать структуру UNICODE_STRING и выводить её через %wZ в DbgPrint(). Ну и совет автору: научись, наконец, префиксы у переменных выставлять корректно: us для UNICODE_STRING, pus для PUNICODE_STRING, w для WCHAR, pw для PWSTR и т.д.
     
  7. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    У меня точно %S, PWCHAR usTempString =(PWCHAR) MmAllocateNonCachedMemory(MAX_PATH); вот так она инициализируется
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Имелось в виду, как сама строка формируется, - возможно, там ошибка.
     
  9. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Код (Text):
    1. VOID CreatePathToUserRecentFolder( IN PWCHAR   UserName,OUT PWCHAR* Path)
    2. {
    3.     PWCHAR usTempString;
    4.     DWORD dwStrOffset = 0,dwTmp = 0;                                                            //Create string in buffer by memory copping
    5.     usTempString =(PWCHAR) MmAllocateNonCachedMemory(MAX_PATH);
    6.     dwTmp = wcslen(SYSTEM_DISK);
    7.     RtlCopyMemory(usTempString,SYSTEM_DISK,dwTmp*sizeof(WCHAR));
    8.     dwStrOffset += dwTmp;
    9.     dwTmp = wcslen(L"Documents and Settings\\");
    10.     RtlCopyMemory(usTempString+dwStrOffset,L"Documents and Settings\\",dwTmp*sizeof(WCHAR));
    11.     dwStrOffset += dwTmp;
    12.     dwTmp = wcslen(UserName);  
    13.     RtlCopyMemory(usTempString+dwStrOffset,UserName,dwTmp*sizeof(WCHAR));
    14.     dwStrOffset += dwTmp;
    15.     dwTmp = wcslen(L"\\Recent");
    16.     RtlCopyMemory(usTempString+dwStrOffset,L"\\Recent",dwTmp*sizeof(WCHAR));
    17.     *Path = usTempString;
    18.     IFDEBUG(DbgPrint("UserName 0x%x\n",usTempString));
    19. }
    Вот так
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Завершающего нуля таки нет.