Skip to content
⌘ NSIS Forum Archive

Structure definition

16 posts

mantty#

Structure definition

Hi all!

I want to make change of a description of a service. And to do this i must call:

C++ code
SERVICE_DESCRIPTION sd;
sd.lpDescription = (char*)SvcDescription.c_str();
ChangeServiceConfig2( hService, SERVICE_CONFIG_DESCRIPTION, &sd)

NSIS:
System::Call 'advapi32::ChangeServiceConfig2( hService, SERVICE_CONFIG_DESCRIPTION, &sd)'

The problem that i have is how do i declare in NSIS sd structure?
kichik#
See http://nsis.sourceforge.net/index.ph...&tx_faq_faq=35

One of the links on this page is for the Service Library which uses System and some structures.

Other System.dll structure examples can be found in Contrib\System.
kichik#
Contact the author. If you can get a copy, I or another archive admin will upload it so it won't get lost again.
KirillKr#
Who is author?

Nopey - system setting tool | | |

--------------------------------------------------------------------------------
Written by doberlec 2003-03-21 07:37:41 Last updated by joost 2003-10-08 13:03:52
evilO#
Hi 🙂 !

I've got what you're looking for, altough I'm not the author...

I downloaded it a couple of months ago, and it is still on my HD.. 😁

evilO/Olive
mantty#
Thanks guys for information.
I tried to make my own job, but i have some difficulties. Can some of you tell me what i did wrong?

this is what i have to do from c++:

typedef struct _SERVICE_DESCRIPTION {
LPTSTR lpDescription;
} SERVICE_DESCRIPTION, *LPSERVICE_DESCRIPTION;

BOOL ChangeServiceConfig2(
SC_HANDLE hService, // handle to service
DWORD dwInfoLevel, // information level
LPVOID lpInfo // new data
);

and i did this in script:

!define SERVICE_ALL_ACCESS 0xF01FF
!define SC_MANAGER_ALL_ACCESS 0x3F
!define stSERVICE_DESCRIPTION "(t)i"
System::Call 'advapi32::OpenSCManagerA(n, n, i ${SC_MANAGER_ALL_ACCESS}) i'
IntCmp $1 0 lbl_done
StrCpy $2 "0x10"
StrCpy $3 "0x3"
StrCpy $4 $ServiceName
StrCpy $5 $ProjectName
StrCpy $6 $MyPath
System::Call `advapi32::CreateServiceA(i r1, t r4, t r5, i ${SERVICE_ALL_ACCESS}, i r2, i r3, i 0, t r6, n, n, n, n, n) i.r7`
StrCmp $7 0 lbl_done lbl_good
lbl_good:
System::Call '${stSERVICE_DESCRIPTION}("My Description") .r8'
System::Call 'advapi32::ChangeServiceConfig2( i r7, i 1, i r8) i.r9'
StrCmp $9 0 0 +1
lbl_done:
System::Call 'advapi32::CloseServiceHandle(i r1) n'

The service it is installing ok, but the description it is not working.
kichik#
See this recent thread:

Are you a developer who uses NSIS to distribute your application? Are you a Winamp plug-in developer who wants to use NSIS to distribute your plug-in? Have suggestions for other people like you? This is the place.


You have the exact same problem in your code.
mantty#
kichik,

thank you very much for the info. I saw that post but i still don't get it working. Can you help me with the right code :-( ... thanks
deguix#edited
Try this (NOT TESTED), probably at least it will be closer to work correctly:

!define SERVICE_ALL_ACCESS 0xF01FF
!define SC_MANAGER_ALL_ACCESS 0x3F
!define SERVICE_CONFIG_DESCRIPTION 1
!define stSERVICE_DESCRIPTION "(i)i"
System::Call 'advapi32::OpenSCManagerA(n, n, \\
i ${SC_MANAGER_ALL_ACCESS}) i'
IntCmp $1 0 lbl_done
StrCpy $2 "0x10"
StrCpy $3 "0x3"
StrCpy $4 $ServiceName
StrCpy $5 $ProjectName
StrCpy $6 $MyPath
System::Call `advapi32::CreateServiceA(i r1, t r4, t r5, \\
i ${SERVICE_ALL_ACCESS}, i r2, i r3, i 0, t r6, n, n, n, \\
n, n) i.r7`
StrCmp $7 "" 0 lbl_good
  SetErrors
  Goto lbl_end
lbl_good:
System::Call '*${stSERVICE_DESCRIPTION} .r8'
System::Call 'advapi32::ChangeServiceConfig2(i r7, \\
i ${SERVICE_CONFIG_DESCRIPTION}, i r8) i.r9'
StrCmp $9 0 0 +2
  SetErrors
lbl_done:
System::Call 'advapi32::CloseServiceHandle(i r1) n'
lbl_end: 
It will set errors if the description wasn't put correctly or if it didn't found the service handle.

(I read all about these APIs, I think it's really gonna work now)
kichik#
Uploaded noepy.zip to archive:

mantty#
thanks deguix for the code. I works almost perfect, but i still don't know how to set the value for the description in structure:

!define stSERVICE_DESCRIPTION "(i)i"
System::Call '*${stSERVICE_DESCRIPTION} .r8'

I want to have somethig like "My descripton there"

Thnaks
deguix#
Try this:

!define DESCRIPTION "My Description"
!define SERVICE_ALL_ACCESS 0xF01FF 
!define SC_MANAGER_ALL_ACCESS 0x3F 
!define SERVICE_CONFIG_DESCRIPTION 1 
!define stSERVICE_DESCRIPTION "(t)i" 
System::Call 'advapi32::OpenSCManagerA(n, n, \\
i ${SC_MANAGER_ALL_ACCESS}) i' 
IntCmp $1 0 lbl_done 
StrCpy $2 "0x10" 
StrCpy $3 "0x3" 
StrCpy $4 $ServiceName 
StrCpy $5 $ProjectName 
StrCpy $6 $MyPath 
System::Call `advapi32::CreateServiceA(i r1, t r4, t r5, \\ 
i ${SERVICE_ALL_ACCESS}, i r2, i r3, i 0, t r6, n, n, n, \\ 
n, n) i.r7` 
StrCmp $7 "" 0 lbl_good 
  SetErrors 
  Goto lbl_end 
lbl_good: 
System::Call '*${stSERVICE_DESCRIPTION}("${DESCRIPTION}") .r8' 
System::Call 'advapi32::ChangeServiceConfig2(i r7, \\ 
i ${SERVICE_CONFIG_DESCRIPTION}, i r8) i.r9' 
StrCmp $9 0 0 +2 
  SetErrors 
lbl_done: 
System::Call 'advapi32::CloseServiceHandle(i r1) n' 
lbl_end: