Если я перезапишу в своём процессе несколько байт в kernel32.dll, изменения на другие процессы не должны распространиться. Но после этого каждый процесс получит свою копию, или мне просто выделят отледьную, а остальные будут совместно использовать оригинал?
Немного непонятно написанное, но вот как по идее все работает: Создается процесс, в его адресное простанство грузится ntdll.dll и kernel32.dll с диска. То есть у каждого процесса есть своя копия. Ты меняешь байты только у себя в адр. простр., а у других процессов остается оригинал библиотеки. То есть, чтобы сделать перехват функции, тебе нужно поменять байты во всех процессах.
Я только внутри себя хочу сделать перехват. Просто начитался тут PAGE_WRITECOPY - до первого изменения процессы разделяют одну проекцию файла, а после - каждый получает свою копию (механизм введён в NT). Вот неужели всё так ужасно - тогда после изменения я заберу [размер образа kernel32.dll]*([число процессов]-1) памяти? Но если эти dll сразу для каждого свои грузятся, как ты написал, то терять нечего. Да... надо подумать.
Лично я не вижу смысла загружать ntdll.dll и kernel32.dll в каждый процесс, можно было бы ОС выделить место в памяти для всех dll (естественно его размер бы динамически менялся), да и грузить их туда, чтобы 100 копий одно библиотеки не было. Тогда перехваты делать было бы просто загляденье - поправил одну библиотеку - и все
именно так. Только ты получишь не полную копию, а копию только той страницы (страниц) в которых сделал изменения. Т.е. модифицированные страницы будут я ту свои а остальные будут продолжать разделятся между всеми.