Ламерский вопрос насчет динмических массивов :D

Тема в разделе "WASM.BEGINNERS", создана пользователем ZamDec, 26 сен 2007.

  1. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Прочитал все темы по динамическим массивам на этом форуме. Но так и не понял как можно увеличивать их длинну БЕЗ "new". Разясните дураку пожалуйста :) Заранее благодарен =)

    П.С. Массив используется в r0. Так что все функции должны быть документированы для ядра.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. PVOID realloc(PVOID pMem, ULONG size, ULONG oldSize)
    2. {
    3.     PVOID pNew;
    4.  
    5.     pNew = ExAllocatePool(PagedPool, size);
    6.     if(!pNew)
    7.         return NULL;
    8.     if ((oldSize) && (pMem)){
    9.         RtlMoveMemory(pNew, pMem, oldSize);
    10.         ExFreePool(pMem);
    11.     }
    12.     return pNew;
    13. }
     
  3. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Благодарю :)
     
  4. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    А если у меня был старый массив
    Код (Text):
    1. typedef struct _element
    2. {
    3.  ULONG PID;
    4.  ULONG BytesWritten;
    5. } element;
    6.  
    7. ULONG           PID_Num = 1;
    8. struct _element PID_Arr[1];
    То увеличить его длинну быдет как ? =\
    Я сделал так :
    Код (Text):
    1. realloc(inarr, sizeof(inarr) + (sizeof(inarr)/PID_Num), sizeof(inarr));
    Это верно ?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у тебя стат. массив
     
  6. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Блин, прошу прощения.... достал наверное уже. Но обьясните дебилу как сделать динамический =\\\\
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    :)
    Код (Text):
    1. CHAR* p;
    2.  
    3. p = ExAllocatePool(NonPagedPool, sizeof(CHAR*3));
    4. p[0] = 'A';
    5. p[1] = 'B';
    6. p[2] = 'C';
    7. ExFreePool(p);
    зачем оно тебе?
     
  8. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Просто исследую функции ядра. Учусь вообщем.

    Компилятор выдает ошибку :
    Код (Text):
    1. 1>driver.c(35) : error C2099: initializer is not a constant
    Объявил как глобальную переменную

    char* p = ExAllocatePool(NonPagedPool, 250);
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Если я не ошибаюсь, то
    Код (Text):
    1. p = ExAllocatePool(NonPagedPool, sizeof(CHAR*3));
    надо заменить на
    Код (Text):
    1. p = ExAllocatePool(NonPagedPool, sizeof(CHAR) * 3);
     
  10. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    ZamDec
    Объявил как глобальную переменную
    При объявлении глобальные переменные можно инициализировать только константами. Объяви без инициализации. Проинициализируй, например, в main
     
  11. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Блин, ребят. Я дуб. Че только не попробовал... =\

    Есть структура
    Код (Text):
    1. typedef struct _element
    2. {
    3.  ULONG PID;
    4.  ULONG BytesWritten;
    5. } element;
    надо чтобы элемент массива была эта структура....

    Делал так :

    Код (Text):
    1. //глобальные переменные
    2. ULONG            PID_Num = 1;
    3. struct element*  PID_Arr;
    4.  
    5. NTSTATUS
    6. DriverEntry(
    7.     IN PDRIVER_OBJECT  DriverObject,
    8.     IN PUNICODE_STRING RegistryPath)
    9. {
    10.   .....
    11.   PID_Arr = ExAllocatePool(NonPagedPool, sizeof(struct _element) * PID_Num);
    12.   DbgPrint("ExAllocatePool - OK.");
    13.   PID_Arr[0].Pid = 123;       // строка номер 249!
    14.   PID_Arr[0].BytesWritten = 6265;
    15. }
    Компилятор выдает ошибку ...
    Код (Text):
    1. driver.c(249) : error C2039: 'Pid' : is not a member of '_element'
    2. driver.c(12) : see declaration of '_element'
    Что я не так делаю ? :8(
     
  12. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    PID_Arr[0].PID
     
  13. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Внимание на регистр
     
  14. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Понял это за минуту до твоего поста. Всеравно спасибо. =) Извините что мозги прополоскал ламерством =]
     
  15. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Никто мне не скажет...
    Код (Text):
    1. // Глобальные переменные
    2. ULONG               PID_Num = 1;
    3. struct _element* PID_Arr;
    4.  
    5.  
    6. NTSTATUS
    7. DriverEntry(
    8.     IN PDRIVER_OBJECT  DriverObject,
    9.     IN PUNICODE_STRING RegistryPath)
    10. {
    11.  
    12. ........................
    13.  
    14.         __try
    15.     {
    16.         //realloc(PID_Arr, sizeof(struct element) * PID_Num, 0);
    17.         PID_Arr = ExAllocatePool(NonPagedPool, sizeof(struct _element) * PID_Num);
    18.         DbgPrint("ExAllocatePool - OK.");
    19.         PID_Arr[0].PID = 123;
    20.         PID_Arr[0].BytesWritten = 6265;
    21.         DbgPrint("%d - %d.", PID_Arr[0].PID, PID_Arr[0].BytesWritten);
    22.         PID_Arr[1].PID = 222;
    23.         PID_Arr[1].BytesWritten = 333;
    24.         DbgPrint("%d - %d.", PID_Arr[1].PID, PID_Arr[1].BytesWritten);
    25.         PID_Arr[2].PID = 444;
    26.         PID_Arr[2].BytesWritten = 777;
    27.         DbgPrint("%d - %d.", PID_Arr[2].PID, PID_Arr[2].BytesWritten);
    28.     }
    29.     __except(EXCEPTION_EXECUTE_HANDLER)
    30.     {
    31.         DbgPrint("FAILEDDDDDDDDDDDDDD.");
    32.     }
    33.  
    34. .........................
    35.  
    36. }
    В DgugView мне показывает
    Код (Text):
    1. ExAllocatePool - OK.
    2. 123 - 6265.
    3. 222 - 333.
    4. 444 - 777.
    Как так ? Ведь 1го и 2го элементов в массиве нет =\ Обращение к ним должно привести к ошибке. Или я что-то не так понимаю ?
     
  16. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    И еще вот это :
    Код (Text):
    1. ULONG            PID_Num = 1;
    2. struct _element* PID_Arr;
    3.  
    4.  
    5. ..............
    6.  
    7.  
    8.  
    9. PVOID realloc(PVOID pMem, ULONG size, ULONG oldSize)
    10. {
    11.     PVOID pNew;
    12.  
    13.     pNew = ExAllocatePool(PagedPool, size);
    14.     if(!pNew) return NULL;
    15.     if ((oldSize) && (pMem))
    16.     {
    17.         RtlMoveMemory(pNew, pMem, oldSize);
    18.         ExFreePool(pMem);
    19.     }
    20.     return pNew;
    21. }
    22.  
    23. ........................
    24.  
    25. PID_Arr = ExAllocatePool(NonPagedPool, sizeof(struct _element) * PID_Num);
    26.         DbgPrint("ExAllocatePool - OK.");
    27.  
    28. for (i = 0; i < 55; i++)
    29.         {
    30.             PID_Num++;
    31.             PID_Arr = realloc(PID_Arr, sizeof(element) * PID_Num, sizeof(PID_Arr));
    32.             PID_Arr[i].PID = 36790 + i;
    33.             PID_Arr[i].BytesWritten = 45678 + i;
    34.             DbgPrint("Array number [%d] : %d - %d.", i, PID_Arr[i].PID, PID_Arr[i].BytesWritten);
    35.         }
    36.         DbgPrint("===========================================================================");
    37.         for (i = 0; i < 55; i++)
    38.         {
    39.             DbgPrint("Array number [%d] : %d - %d.", i, PID_Arr[i].PID, PID_Arr[i].BytesWritten);
    40.         }
    41.         ExFreePool(PID_Arr);
    42.  
    43. ........................
    Получаю следующее :
    Код (Text):
    1. ExAllocatePool - OK.
    2. Array number [0] : 36790 - 45678.
    3. Array number [1] : 36791 - 45679.
    4. Array number [2] : 36792 - 45680.
    5. Array number [3] : 36793 - 45681.
    6. Array number [4] : 36794 - 45682.
    7. Array number [5] : 36795 - 45683.
    8. Array number [6] : 36796 - 45684.
    9. Array number [7] : 36797 - 45685.
    10. Array number [8] : 36798 - 45686.
    11. Array number [9] : 36799 - 45687.
    12. Array number [10] : 36800 - 45688.
    13. Array number [11] : 36801 - 45689.
    14. Array number [12] : 36802 - 45690.
    15. Array number [13] : 36803 - 45691.
    16. Array number [14] : 36804 - 45692.
    17. Array number [15] : 36805 - 45693.
    18. Array number [16] : 36806 - 45694.
    19. Array number [17] : 36807 - 45695.
    20. Array number [18] : 36808 - 45696.
    21. Array number [19] : 36809 - 45697.
    22. Array number [20] : 36810 - 45698.
    23. Array number [21] : 36811 - 45699.
    24. Array number [22] : 36812 - 45700.
    25. Array number [23] : 36813 - 45701.
    26. Array number [24] : 36814 - 45702.
    27. Array number [25] : 36815 - 45703.
    28. Array number [26] : 36816 - 45704.
    29. Array number [27] : 36817 - 45705.
    30. Array number [28] : 36818 - 45706.
    31. Array number [29] : 36819 - 45707.
    32. Array number [30] : 36820 - 45708.
    33. Array number [31] : 36821 - 45709.
    34. Array number [32] : 36822 - 45710.
    35. Array number [33] : 36823 - 45711.
    36. Array number [34] : 36824 - 45712.
    37. Array number [35] : 36825 - 45713.
    38. Array number [36] : 36826 - 45714.
    39. Array number [37] : 36827 - 45715.
    40. Array number [38] : 36828 - 45716.
    41. Array number [39] : 36829 - 45717.
    42. Array number [40] : 36830 - 45718.
    43. Array number [41] : 36831 - 45719.
    44. Array number [42] : 36832 - 45720.
    45. Array number [43] : 36833 - 45721.
    46. Array number [44] : 36834 - 45722.
    47. Array number [45] : 36835 - 45723.
    48. Array number [46] : 36836 - 45724.
    49. Array number [47] : 36837 - 45725.
    50. Array number [48] : 36838 - 45726.
    51. Array number [49] : 36839 - 45727.
    52. Array number [50] : 36840 - 45728.
    53. Array number [51] : 36841 - 45729.
    54. Array number [52] : 36842 - 45730.
    55. Array number [53] : 36843 - 45731.
    56. Array number [54] : 36844 - 45732.
    57. ===========================================================================
    58. Array number [0] : 36790 - 0.
    59. Array number [1] : 1314816 - 983103.
    60. Array number [2] : 257 - 83886080.
    61. Array number [3] : 18 - 1317376.
    62. Array number [4] : 268435456 - 257.
    63. Array number [5] : 83886080 - 18.
    64. Array number [6] : 1317376 - 268435456.
    65. Array number [7] : 257 - 50331648.
    66. Array number [8] : 0 - 12.
    67. Array number [9] : 1313536 - -2147483648.
    68. Array number [10] : 257 - 83886080.
    69. Array number [11] : 12 - 0.
    70. Array number [12] : 0 - 0.
    71. Array number [13] : 0 - -464433000.
    72. Array number [14] : 0 - 0.
    73. Array number [15] : 0 - 0.
    74. Array number [16] : 0 - 0.
    75. Array number [17] : 0 - 0.
    76. Array number [18] : 0 - 0.
    77. Array number [19] : 0 - 0.
    78. Array number [20] : 0 - 0.
    79. Array number [21] : 0 - 0.
    80. Array number [22] : 0 - 0.
    81. Array number [23] : 0 - 0.
    82. Array number [24] : 0 - 0.
    83. Array number [25] : -464433000 - 0.
    84. Array number [26] : 0 - 0.
    85. Array number [27] : 0 - 0.
    86. Array number [28] : 0 - 0.
    87. Array number [29] : 0 - 0.
    88. Array number [30] : 0 - 0.
    89. Array number [31] : 0 - 0.
    90. Array number [32] : 0 - 0.
    91. Array number [33] : 0 - 0.
    92. Array number [34] : 0 - 0.
    93. Array number [35] : 0 - 0.
    94. Array number [36] : 0 - 0.
    95. Array number [37] : 0 - 0.
    96. Array number [38] : 0 - 0.
    97. Array number [39] : 0 - 0.
    98. Array number [40] : 0 - 0.
    99. Array number [41] : 0 - 0.
    100. Array number [42] : 0 - 0.
    101. Array number [43] : 0 - 0.
    102. Array number [44] : 0 - 0.
    103. Array number [45] : 0 - 0.
    104. Array number [46] : 0 - 0.
    105. Array number [47] : 0 - 0.
    106. Array number [48] : 0 - 0.
    107. Array number [49] : 0 - 0.
    108. Array number [50] : 65535 - -1.
    109. Array number [51] : 0 - 0.
    110. Array number [52] : 0 - 0.
    111. Array number [53] : 197832 - 0.
    112. Array number [54] : 36844 - 45732.
     
  17. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    ZamDec

    Память выделяется страницами (4 килобайта, или 2 мегабайта или 4 мегабайта, на AMD последних еще и 1 Гб) физически процессором, а вот уже операционка выделяет столько на этой странице - сколько ты запросил. Т.о. ты читаешь либо еще не выделенную память или чужую. Си вообще не знает сколько ты выделил памяти функцией ExAllocatePool.

    Исключение возникнет если обратиться к немепированной памяти, т.е. той которая не выделена процессором.
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    ZamDec
    третий параметр в realloc должен быть в этом случае sizeof (element)*(PID_Num-1) или sizeof (_element)*(PID_Num-1) - хз как правильно :)
     
  19. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    гиговые страници ? o0
     
  20. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    А вот если сделать так:

    char* MyStr;

    MyStr = ExAllocatePool(NonPagedPool, sizeof(char) * 64);
    sprintf(MyStr , "qwerty");

    То в конце в MyStr мы получим значение = "(null)";

    почему так ? =\