> There is more reliable way. For example. > > h = GetProcessWindowStation(); > if (h==NULL) fatal error; /* or return "runs as service" */ > if (GetUserObjectInformationW (h,UOI_NAME,NULL,0,NULL,&len) || > GetLastError() != ERROR_INSUFFICIENT_BUFFER) > fatal error; /* or return "runs as service" */
Complete working snippet below. Note that it return -1 if it didn't manage to initialize window station, 1 if called in [non interactive] service context and 0 if called in interactive context. Tested with M$C and Cygwin gcc. A. #include <windows.h> #include <malloc.h> static const WCHAR *_own_wcsstr(const WCHAR *str,const WCHAR *key) { int i; if (str==NULL || key==NULL || *key==L'\0') return NULL; for (i=0;*str!=L'\0';str++) if (*str!=*key) str-=i, key-=i, i=0; else if (*(++key)==L'\0') return str-i; else i++; return NULL; } int IsService() { HWINSTA h; DWORD len; WCHAR *name; GetDesktopWindow(); /* return value is ignored */ h = GetProcessWindowStation(); if (h==NULL) return -1; if (GetUserObjectInformationW (h,UOI_NAME,NULL,0,&len) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) return -1; if (len>512) return -1; /* paranoia */ len++,len&=~1; /* paranoia */ #ifdef _MSC_VER name=(WCHAR *)_alloca(len+sizeof(WCHAR)); #else name=(WCHAR *)alloca(len+sizeof(WCHAR)); #endif if (!GetUserObjectInformationW (h,UOI_NAME,name,len,&len)) return -1; len++,len&=~1; /* paranoia */ name[len/sizeof(WCHAR)]=L'\0'; /* paranoia */ #if 1 /* This doesn't cover "interactive" services [working with real * WinSta0's] nor programs started non-interactively by Task * Scheduler [those are working with SAWinSta]. */ if (_own_wcsstr(name,L"Service-0x")) #else /* This covers all non-interactive programs such as services. */ if (!_own_wcsstr(name,L"WinSta0")) #endif return 1; else return 0; } ______________________________________________________________________ OpenSSL Project http://www.openssl.org Development Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]