Прочитал все темы по динамическим массивам на этом форуме. Но так и не понял как можно увеличивать их длинну БЕЗ "new". Разясните дураку пожалуйста Заранее благодарен =) П.С. Массив используется в r0. Так что все функции должны быть документированы для ядра.
Код (Text): PVOID realloc(PVOID pMem, ULONG size, ULONG oldSize) { PVOID pNew; pNew = ExAllocatePool(PagedPool, size); if(!pNew) return NULL; if ((oldSize) && (pMem)){ RtlMoveMemory(pNew, pMem, oldSize); ExFreePool(pMem); } return pNew; }
А если у меня был старый массив Код (Text): typedef struct _element { ULONG PID; ULONG BytesWritten; } element; ULONG PID_Num = 1; struct _element PID_Arr[1]; То увеличить его длинну быдет как ? =\ Я сделал так : Код (Text): realloc(inarr, sizeof(inarr) + (sizeof(inarr)/PID_Num), sizeof(inarr)); Это верно ?
Код (Text): CHAR* p; p = ExAllocatePool(NonPagedPool, sizeof(CHAR*3)); p[0] = 'A'; p[1] = 'B'; p[2] = 'C'; ExFreePool(p); зачем оно тебе?
Просто исследую функции ядра. Учусь вообщем. Компилятор выдает ошибку : Код (Text): 1>driver.c(35) : error C2099: initializer is not a constant Объявил как глобальную переменную char* p = ExAllocatePool(NonPagedPool, 250);
Если я не ошибаюсь, то Код (Text): p = ExAllocatePool(NonPagedPool, sizeof(CHAR*3)); надо заменить на Код (Text): p = ExAllocatePool(NonPagedPool, sizeof(CHAR) * 3);
ZamDec Объявил как глобальную переменную При объявлении глобальные переменные можно инициализировать только константами. Объяви без инициализации. Проинициализируй, например, в main
Блин, ребят. Я дуб. Че только не попробовал... =\ Есть структура Код (Text): typedef struct _element { ULONG PID; ULONG BytesWritten; } element; надо чтобы элемент массива была эта структура.... Делал так : Код (Text): //глобальные переменные ULONG PID_Num = 1; struct element* PID_Arr; NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { ..... PID_Arr = ExAllocatePool(NonPagedPool, sizeof(struct _element) * PID_Num); DbgPrint("ExAllocatePool - OK."); PID_Arr[0].Pid = 123; // строка номер 249! PID_Arr[0].BytesWritten = 6265; } Компилятор выдает ошибку ... Код (Text): driver.c(249) : error C2039: 'Pid' : is not a member of '_element' driver.c(12) : see declaration of '_element' Что я не так делаю ? :8(
Понял это за минуту до твоего поста. Всеравно спасибо. =) Извините что мозги прополоскал ламерством =]
Никто мне не скажет... Код (Text): // Глобальные переменные ULONG PID_Num = 1; struct _element* PID_Arr; NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { ........................ __try { //realloc(PID_Arr, sizeof(struct element) * PID_Num, 0); PID_Arr = ExAllocatePool(NonPagedPool, sizeof(struct _element) * PID_Num); DbgPrint("ExAllocatePool - OK."); PID_Arr[0].PID = 123; PID_Arr[0].BytesWritten = 6265; DbgPrint("%d - %d.", PID_Arr[0].PID, PID_Arr[0].BytesWritten); PID_Arr[1].PID = 222; PID_Arr[1].BytesWritten = 333; DbgPrint("%d - %d.", PID_Arr[1].PID, PID_Arr[1].BytesWritten); PID_Arr[2].PID = 444; PID_Arr[2].BytesWritten = 777; DbgPrint("%d - %d.", PID_Arr[2].PID, PID_Arr[2].BytesWritten); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("FAILEDDDDDDDDDDDDDD."); } ......................... } В DgugView мне показывает Код (Text): ExAllocatePool - OK. 123 - 6265. 222 - 333. 444 - 777. Как так ? Ведь 1го и 2го элементов в массиве нет =\ Обращение к ним должно привести к ошибке. Или я что-то не так понимаю ?
И еще вот это : Код (Text): ULONG PID_Num = 1; struct _element* PID_Arr; .............. PVOID realloc(PVOID pMem, ULONG size, ULONG oldSize) { PVOID pNew; pNew = ExAllocatePool(PagedPool, size); if(!pNew) return NULL; if ((oldSize) && (pMem)) { RtlMoveMemory(pNew, pMem, oldSize); ExFreePool(pMem); } return pNew; } ........................ PID_Arr = ExAllocatePool(NonPagedPool, sizeof(struct _element) * PID_Num); DbgPrint("ExAllocatePool - OK."); for (i = 0; i < 55; i++) { PID_Num++; PID_Arr = realloc(PID_Arr, sizeof(element) * PID_Num, sizeof(PID_Arr)); PID_Arr[i].PID = 36790 + i; PID_Arr[i].BytesWritten = 45678 + i; DbgPrint("Array number [%d] : %d - %d.", i, PID_Arr[i].PID, PID_Arr[i].BytesWritten); } DbgPrint("==========================================================================="); for (i = 0; i < 55; i++) { DbgPrint("Array number [%d] : %d - %d.", i, PID_Arr[i].PID, PID_Arr[i].BytesWritten); } ExFreePool(PID_Arr); ........................ Получаю следующее : Код (Text): ExAllocatePool - OK. Array number [0] : 36790 - 45678. Array number [1] : 36791 - 45679. Array number [2] : 36792 - 45680. Array number [3] : 36793 - 45681. Array number [4] : 36794 - 45682. Array number [5] : 36795 - 45683. Array number [6] : 36796 - 45684. Array number [7] : 36797 - 45685. Array number [8] : 36798 - 45686. Array number [9] : 36799 - 45687. Array number [10] : 36800 - 45688. Array number [11] : 36801 - 45689. Array number [12] : 36802 - 45690. Array number [13] : 36803 - 45691. Array number [14] : 36804 - 45692. Array number [15] : 36805 - 45693. Array number [16] : 36806 - 45694. Array number [17] : 36807 - 45695. Array number [18] : 36808 - 45696. Array number [19] : 36809 - 45697. Array number [20] : 36810 - 45698. Array number [21] : 36811 - 45699. Array number [22] : 36812 - 45700. Array number [23] : 36813 - 45701. Array number [24] : 36814 - 45702. Array number [25] : 36815 - 45703. Array number [26] : 36816 - 45704. Array number [27] : 36817 - 45705. Array number [28] : 36818 - 45706. Array number [29] : 36819 - 45707. Array number [30] : 36820 - 45708. Array number [31] : 36821 - 45709. Array number [32] : 36822 - 45710. Array number [33] : 36823 - 45711. Array number [34] : 36824 - 45712. Array number [35] : 36825 - 45713. Array number [36] : 36826 - 45714. Array number [37] : 36827 - 45715. Array number [38] : 36828 - 45716. Array number [39] : 36829 - 45717. Array number [40] : 36830 - 45718. Array number [41] : 36831 - 45719. Array number [42] : 36832 - 45720. Array number [43] : 36833 - 45721. Array number [44] : 36834 - 45722. Array number [45] : 36835 - 45723. Array number [46] : 36836 - 45724. Array number [47] : 36837 - 45725. Array number [48] : 36838 - 45726. Array number [49] : 36839 - 45727. Array number [50] : 36840 - 45728. Array number [51] : 36841 - 45729. Array number [52] : 36842 - 45730. Array number [53] : 36843 - 45731. Array number [54] : 36844 - 45732. =========================================================================== Array number [0] : 36790 - 0. Array number [1] : 1314816 - 983103. Array number [2] : 257 - 83886080. Array number [3] : 18 - 1317376. Array number [4] : 268435456 - 257. Array number [5] : 83886080 - 18. Array number [6] : 1317376 - 268435456. Array number [7] : 257 - 50331648. Array number [8] : 0 - 12. Array number [9] : 1313536 - -2147483648. Array number [10] : 257 - 83886080. Array number [11] : 12 - 0. Array number [12] : 0 - 0. Array number [13] : 0 - -464433000. Array number [14] : 0 - 0. Array number [15] : 0 - 0. Array number [16] : 0 - 0. Array number [17] : 0 - 0. Array number [18] : 0 - 0. Array number [19] : 0 - 0. Array number [20] : 0 - 0. Array number [21] : 0 - 0. Array number [22] : 0 - 0. Array number [23] : 0 - 0. Array number [24] : 0 - 0. Array number [25] : -464433000 - 0. Array number [26] : 0 - 0. Array number [27] : 0 - 0. Array number [28] : 0 - 0. Array number [29] : 0 - 0. Array number [30] : 0 - 0. Array number [31] : 0 - 0. Array number [32] : 0 - 0. Array number [33] : 0 - 0. Array number [34] : 0 - 0. Array number [35] : 0 - 0. Array number [36] : 0 - 0. Array number [37] : 0 - 0. Array number [38] : 0 - 0. Array number [39] : 0 - 0. Array number [40] : 0 - 0. Array number [41] : 0 - 0. Array number [42] : 0 - 0. Array number [43] : 0 - 0. Array number [44] : 0 - 0. Array number [45] : 0 - 0. Array number [46] : 0 - 0. Array number [47] : 0 - 0. Array number [48] : 0 - 0. Array number [49] : 0 - 0. Array number [50] : 65535 - -1. Array number [51] : 0 - 0. Array number [52] : 0 - 0. Array number [53] : 197832 - 0. Array number [54] : 36844 - 45732.
ZamDec Память выделяется страницами (4 килобайта, или 2 мегабайта или 4 мегабайта, на AMD последних еще и 1 Гб) физически процессором, а вот уже операционка выделяет столько на этой странице - сколько ты запросил. Т.о. ты читаешь либо еще не выделенную память или чужую. Си вообще не знает сколько ты выделил памяти функцией ExAllocatePool. Исключение возникнет если обратиться к немепированной памяти, т.е. той которая не выделена процессором.
ZamDec третий параметр в realloc должен быть в этом случае sizeof (element)*(PID_Num-1) или sizeof (_element)*(PID_Num-1) - хз как правильно
А вот если сделать так: char* MyStr; MyStr = ExAllocatePool(NonPagedPool, sizeof(char) * 64); sprintf(MyStr , "qwerty"); То в конце в MyStr мы получим значение = "(null)"; почему так ? =\