KERNEL32.DLL WIN98 vs. WIN95

Il modo migliore per valutare i cambiamenti introdotti da una nuova release di Windows è confrontare quali nuove API sono fornite dal nuovo sistema operativo. A causa della mancanza di documentazione tecnica (perlomeno a livello di API) che dovrebbe a mio avviso accompagnare ogni nuova release, ho preso la buona abitudine di esplorare direttamente i cambiamenti avvenuti nelle varie parti (librerie dinamiche e VxD) di Windows. In questo breve articolo guarderemo dall'orbita (cioè da molto lontano) i cambiamenti che ha subito la libreria KERNEL32.DLL (eseguibile che come suggerisce il nome contiene una buona parte del kernel di Windows) passando da Windows 95 a Windows 98. La tabella seguente (Tabella 1) contiene un riassunto dei cambiamenti subiti da KERNEL32.DLL.

Tabella 1

  Win95 Win98 Delta
Dimensione DLL 421.376 479.232 57.856
Dimensione del codice 303.616 350.208 46.592
Dimensione dati inizializzati 116.736 108.032 -8.704
Numero sezioni 6 5 -1
Numero data directory 13 13 0
Ordinale di base 1 1 0
Numero di funzioni 782 865 83
Numero di funzioni con nome 682 745 63
Funzioni non documentate 100 120 20

 

Ovviamente la dimensione della libreria è aumentata, come mi aspettavo è stato aggiunto del codice ma - sorpresa, sorpresa - è stata ridotta la quantità di dati contenuti (notare che è stata rimossa la sezione .edata). Sono state aggiunte 83 nuove funzioni (+10% rispetto alla versione di Windows 95) di cui 20 sono non documentate. A scanso d'equivoci, con il termine non documentate intendo riferirmi solo a quelle funzioni contenute in KERNEL32.DLL che sono esportate esclusivamente per ordinale e non all'effettiva disponibilità di documentazione a riguardo della funzione. Dal mio punto di vista, il fatto che Microsoft abbia volutamente nascosto il nome della funzione significa che essa preferisce impedire l'uso di queste funzioni. La tabella 2 mostra solo le funzioni esportate con nome (e naturalmente con ordinale) aggiunte in Windows 98.

Tabella 2

Nuove funzioni in Windows 98
CancelDeviceWakeupRequest()
CancelIo()
CancelWaitableTimer()
ConvertThreadToFiber()
CopyFileExA()
CopyFileExW()
CreateFiber()
CreateWaitableTimerA()
CreateWaitableTimerW()
DeleteFiber()
EnumCalendarInfoExA()
EnumCalendarInfoExW()
EnumDateFormatsExA()
EnumDateFormatsExW()
FindFirstFileExA()
FindFirstFileExW()
GetCalendarInfoA()
GetCalendarInfoW()
GetCPInfoExA()
GetCPInfoExW()
GetDevicePowerState()
GetFileAttributesExA()
GetFileAttributesExW()
GetLongPathNameA()
GetLongPathNameW()
GetProcessPriorityBoost()
GetThreadPriorityBoost()
GetWriteWatch()
InitializeCriticalSectionAndSpinCount()
InterlockedCompareExchange()
InterlockedExchangeAdd()
IsDebuggerPresent()
IsProcessorFeaturePresent()
IsSystemResumeAutomatic()
K32_NtCreateFile()
K32_RtlNtStatusToDosError()
OpenWaitableTimerA()
OpenWaitableTimerW()
ReadDirectoryChangesW()
ReadFileScatter()
RegisterSysMsgHandler()
RequestDeviceWakeup()
RequestWakeupLatency()
ResetNLSUserInfoCache()
ResetWriteWatch()
SetCalendarInfoA()
SetCalendarInfoW()
SetCriticalSectionSpinCount()
SetMessageWaitingIndicator()
SetProcessAffinityMask()
SetProcessPriorityBoost()
SetThreadExecutionState()
SetThreadIdealProcessor()
SetThreadPriorityBoost()
SetWaitableTimer()
SignalObjectAndWait()
SignalSysMsgHandlers()
SwitchToFiber()
SwitchToThread()
TryEnterCriticalSection()
VirtualAllocEx()
VirtualFreeEx()
WriteFileGather()

 

Sempre in Tabella 2 penso che non sia sfuggita a nessuno la parola DOS contenuta in K32_RtlNtStatusToDosError(), cioè in una nuovissima funzione di Windows 98. Sembra che il DOS sia sopravvissuto anche in Windows 98. Le liste seguenti (Lista 1 e Lista 2) contengono l'elenco completo delle funzioni contenute nella libreria dinamica KERNEL32.DLL ordinate rispettivamente per ordinale e per nome.

Lista 1 - Elenco delle funzioni esportate da KERNEL32.DLL per ordinale

Lista 2 - Elenco delle funzioni esportate da KERNEL32.DLL per nome

Osservando con attenzione la Lista 1 e Lista 2 pare che l'utilizzo dell'ordinale per eseguire una funzione sia impossibile, infatti per tutte le funzioni che hanno un nome (cioè documentate in senso stretto!) col cambio di versione è stato variato anche il numero ordinale d'esportazione. Ciò è dovuto al fatto che inspiegabilmente Microsoft ha aggiunto le nuove 20 funzioni non documentate a partire dall'ordinale 102 e fino all'ordinale 122. Azzardo un'ipotesi (non verificata!!!) sull'origine di questa stranezza: dalla funzione GetProcAddress() che richiede in input due parametri (come primo l'handle del modulo che contiene la funzione e per secondo il nome o l'ordinale della funzione), ci si aspetta l'indirizzo a cui 'chiamare' la funzione. Purtroppo GetProcAddress() fallisce se si tenta di ottenere l'indirizzo in cui si trova una delle funzioni non documentate cioè le prime 122 funzioni (AddAtomA() e AddAtomW() escluse) esportate da KERNEL32.DLL. Probabilmente GetProcAddress() dopo aver stabilito che si vuole ottenere tramite ordinale l'indirizzo di una funzione contenuta in KERNEL32.DLL, è in grado di stabilire se restituire o no l'indirizzo della funzione semplicemente verificando se l'ordinale è inferiore a 123. Ecco perché le nuove funzioni non documentate sono state inserite a partire dall'ordinale 100 e non accodate dopo l'ordinale 782 (ripeto, questa è solo una mia ipotesi che non ho ancora verificato). Sembra che Microsoft oltre a nascondere le funzioni non documentate voglia anche (per qualche motivo oscuro) impedirne l'uso. Per completare questo 'tour' attorno ai cambiamenti subiti da parte del kernel di soltanto una mia congettura non Windows, la da KRNL386.EXE (l'equivalente a 16 bit di KERNEL32.DLL). La Lista 3 contiene l'elenco delle funzioni esportate da KRNL386.EXE per le versioni 95 e 98 di Windows.

Lista 3 - Funzioni delle funzioni esportate da KRNL386.EXE

Nel passaggio da Windows 95 a Windows 98 questo eseguibile ha subito poche variazioni, infatti sono state aggiunte solo 3 funzioni non documentate corrispondenti agli ordinali 495, 705 e 750. Visto che dal nome (che per ora è l'unica documentazione che ho su di esse!) alcune nuove funzioni risultano essere 'interessanti', se vogliamo conoscerle non ci resta che 'abbandonare l'orbita e scendere sulla terra' cioè nel codice delle funzioni.

 


Copyright © 1998 by Roberto Bianchi - Ultimo aggiornamento 13/11/98