2009-02-02 7 views
0

La façon normale d'obtenir le numéro de série Windows est WMI. Je ne veux pas utiliser WMI parce que la structure compacte ne le supporte pas. L'assemblage doit fonctionner sur le bureau et le côté de la structure compacte, donc je ne peux pas ajouter la référence.Appel Pinvoke pour obtenir le numéro de série de Windows?

Comment puis-je obtenir le même résultat en utilisant un appel PinVoke?

Répondre

1

Vous devez appeler KernelIOControl pour WindowsCE.

Voici le code C++, n'ont pas le temps de le convertir en C#

#include <WINIOCTL.H> 
extern "C" __declspec(dllimport) 
BOOL KernelIoControl(DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned); 
#define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) 

CString GetSerialNumberFromKernelIoControl() { 
    DWORD dwOutBytes; 
    const int nBuffSize = 4096; 
    byte arrOutBuff[nBuffSize]; 
    BOOL bRes = ::KernelIoControl(IOCTL_HAL_GET_DEVICEID, 0, 0, arrOutBuff, nBuffSize, &dwOutBytes); 
    if (bRes) { CString strDeviceInfo; for (unsigned int i = 0; i<dwOutBytes; i++) { 
     CString strNextChar; strNextChar.Format(TEXT("%02X"), arrOutBuff[i]); strDeviceInfo += strNextChar; 
    } 
    CString strDeviceId = strDeviceInfo.Mid(40,2) + strDeviceInfo.Mid(45,9) + strDeviceInfo.Mid(70,6); 
    return strDeviceId; 
    } else { 
     return _T(""); 
    } 
} 

Edit: (PInvoke kernelIOControl C#)

[DllImport("coredll.dll")] 
    public static extern bool KernelIoControl(long dwIoControlCode, IntPtr lpInBuff, long dwInBuffSize, IntPtr lpOutBuff, long dwOutBuffSize, IntPtr lpBytesReturned); 
0

Tout d'abord, vous n'êtes pas va avoir un seul appel qui fonctionne sur le bureau et l'appareil. Ça n'arrivera tout simplement pas. Ce que vous pouvez faire est de déterminer l'environnement d'exécution avec un quelque chose d'appel comme celui-ci:

if(Environment.OSVersion.Platform == PlatformID.WinCE) { ... } 

Cela vous donnera la séparation pour le bureau et l'appareil.

Ensuite, vous devez ajouter la complexité pour les périphériques, et pour cela, vous devez connaître votre matériel cible. Pour Windows Mobile 5.0 et versions ultérieures, vous voulez appeler GetDeviceUniqueID, car l'appel KernelIoControl va très probablement être protégé. Pocket PC 2003 et versions antérieures, le P/Invoke de KernelIoControl est raisonnable, bien que de nombreux périphériques soient connus pour présenter le même résultat, donc ce n'est pas garanti unique.

Pour les périphériques Windows CE génériques, il est beaucoup plus varié. Rien ne garantit qu'une plate-forme implémente IOCTL_HAL_GET_DEVICEID, donc vous allez vouloir protéger pour l'échec et trouver un autre mécanisme (souvent les OEM implémentent leur propre API d'ID). Pour CE 6.0, KernelIoControl est très restreint pour les applications, et il est peu probable que vous puissiez l'appeler sans l'aide d'un noyau ou d'une API d'encapsulation de pilote de l'OEM.

Questions connexes