2016-05-17 13 views
7

Come posso chiamare le funzioni API di Windows da un binario Linux all'interno di Windows Subsystem per Linux (WSL)? Sono abbastanza sicuro che non ci sia un modo documentato per farlo, ma nonostante ciò potrebbe essere interessante provarlo.Chiama Win32/NT-Native API dal sottosistema Windows per i processi Linux?

Sono interessato a chiamare le funzioni Win32 o, se ciò non è possibile, almeno API native di Windows NT (Nt *, Zw *). Le API native dovrebbero essere almeno disponibili, poiché il componente che esegue i processi Linux (lxss) dipende da queste API.

Potrebbe essere necessario creare una funzione di tipo LoadLibrary personalizzata per caricare le DLL di Windows. Un'altra idea sarebbe quella di cercare nella memoria del processo parti conosciute di funzioni del kernel (cioè i loro punti di ingresso in modalità utente).

Qualcuno ha sperimentato questo e vorrebbe condividere una soluzione?

+1

Questa presentazione - https://github.com/ionescu007/lxss/blob/master/The%20Linux%20kernel%20hidden%20inside%20windows%2010.pdf - suggerisce (almeno per me) che i processi di Linux siano così -called pico processato quello che non ha ntdll mappato al loro spazio indirizzo. Inoltre, tutte le chiamate di sistema sono gestite dal provider del processo pico per WSL (mi aspetto che utilizzino solo una diversa tabella di invio del servizio di sistema, quindi le sysc di NT non sono raggiungibili dallo spazio utente). –

risposta

5

In breve, non è possibile.

I processi effettivi in ​​cui vengono eseguiti i processi Linux non sono processi Win32 e non sono in grado di caricare ed eseguire il codice in modalità utente Win32 né sono in grado di richiamare i punti di ingresso del kernel Win32 NT standard.

Per ulteriori informazioni sull'infrastruttura PicoProcess utilizzata da WSL, leggere this blog and/or watch the accompanying video.

Se si desidera "chiamare" il codice di Windows dal codice in esecuzione all'interno di WSL, è possibile prendere in considerazione l'utilizzo di una qualche forma di tecnologia di chiamata socket/messaging/RPC/REST in cui l'etiher/entrambe le estremità della relazione possono essere ascoltate e rispondere ai messaggi trasportati tramite alcuni network/socket/pipe.