Tag: windows

Entries for tag "windows", ordered from most recent. Entry count: 40.

Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

Pages: > 1 2 3 4 5 >

# Coding Windows Services in C++

18:31
Fri
01
Oct 2010

Services in Windows are like daemons in Linux - resident programs that work in background. I've recently learned how to code them in C++ using WinAPI. Here is a quick tutorial about this:

All the documentation you need to develop services can be found in MSDN Library. If you have it offline, go to: Win32 and COM Development / System Services / DLLs, Processes and Threads / SDK Documentation / DLLs, Processed, and Threads / Services. You can also read it online HERE. I talk only about native C and C++ code here, but services can also be written in .NET.

What are pros and cons of services, comparing to normal applications? Service can be automatically started with the system and work all the time, no matter if any user logs on and off. It can have extensive priviledges to access files on hard disk and the like, no matter what limitations do the logged-in user have. But service cannot interact directly with the user - it cannot show console or any window. So the only way for a service to do any input/output is to read some configuration files, write some log files or to communicate with some other client process ran by the user, e.g. via TCP socket connected to "localhost".

Service is written as a console application that uses special WinAPI functions to communicate with so called SCM - Service Control Manager. Example entry point routine looks like this:

// Standard console application entry point.
int main(int argc, char **argv)
{
    SERVICE_TABLE_ENTRY serviceTable[] = {
        { _T(""), &ServiceMain },
        { NULL, NULL }
    };
       
    if (StartServiceCtrlDispatcher(serviceTable))
        return 0;
    else if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
        return -1; // Program not started as a service.
    else
        return -2; // Other error.
}

StartServiceCtrlDispatcher is the first service-related function used here. It needs an array because a process can implement multiple different services, but I show only single-service process here. The function blocks for the entire execution time of working service and fails if program was run as normal application, not as a service. While service is working, a callback function is being executed, which I called ServiceMain here. It should initialize service and then execute all the code in loop until system wants to stop the service. You can also exit the function and thus stop the service at any time if you want (e.g. if some critical error occured).

// Main function to be executed as entire service code.
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
    // Must be called at start.
    g_ServiceStatusHandle = RegisterServiceCtrlHandlerEx(_T("SERVICE NAME"), &HandlerEx, NULL);
   
    // Startup code.
    ReportStatus(SERVICE_START_PENDING);
    g_StopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    /* Here initialize service...
    Load configuration, acquire resources etc. */
    ReportStatus(SERVICE_RUNNING);

    /* Main service code
    Loop, do some work, block if nothing to do,
    wait or poll for g_StopEvent... */
    while (WaitForSingleObject(g_StopEvent, 3000) != WAIT_OBJECT_0)
    {
        // This sample service does "BEEP!" every 3 seconds.
        Beep(1000, 100);
    }

    ReportStatus(SERVICE_STOP_PENDING);
    /* Here finalize service...
    Save all unsaved data etc., but do it quickly.
    If g_SystemShutdown, you can skip freeing memory etc. */
    CloseHandle(g_StopEvent);
    ReportStatus(SERVICE_STOPPED);
}

RegisterServiceCtrlHandlerEx is a function that must be called first to register your application as a service, pass its name and a pointer to your control event handler function. Then you do some initialization, execute main service code in a loop and after it's time to stop it, do the cleanup and exit.

Service should report its state to the SCM with SetServiceStatus function. It can be called at any time and from any thread and informs the system about if your service is stopped, running, starting, stopping, paused etc. This function takes quite sophisticated SERVICE_STATUS structure, but I believe it can be simplified to three main cases which I enclosed in the following functions: ReportStatus reports basic status like SERVICE_STOPPED, SERVICE_RUNNING, SERVICE_START_PENDING or SERVICE_STOP_PENDING.

SERVICE_STATUS_HANDLE g_ServiceStatusHandle; 
HANDLE g_StopEvent;
DWORD g_CurrentState = 0;
bool g_SystemShutdown = false;

void ReportStatus(DWORD state)
{
    g_CurrentState = state;
    SERVICE_STATUS serviceStatus = {
        SERVICE_WIN32_OWN_PROCESS,
        g_CurrentState,
        state == SERVICE_START_PENDING ? 0 : SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
        NO_ERROR,
        0,
        0,
        0,
    };
    SetServiceStatus(g_ServiceStatusHandle, &serviceStatus);
}

Third member of the SERVICE_STATUS structure - dwControlsAccepted - indicates which events will be accepted by the service after this call. I want to accept events informing about system shutdown and allow user to stop the service. I could also pass SERVICE_ACCEPT_PAUSE_CONTINUE here, which means I supported pausing and resuming the service.

ReportProgressStatus function reports service status during initialization and finalization - SERVICE_START_PENDING, SERVICE_STOP_PENDING, SERVICE_CONTINUE_PENDING, SERVICE_PAUSE_PENDING. I don't actually use it, but if the startup or shutdown of your service takes a lot of time, you should periodically report progress with this function. CheckPoint is simply a counter that should be incremented with each call, telling that service is making some progress. WaitHint is an estimated time it will take to finish initialization, finalization or to perform its next step. By default, system waits about 30 seconds for your service to start or stop and you should not exceed that without a good reason.

void ReportProgressStatus(DWORD state, DWORD checkPoint, DWORD waitHint)
{
    g_CurrentState = state;
    SERVICE_STATUS serviceStatus = {
        SERVICE_WIN32_OWN_PROCESS,
        g_CurrentState,
        state == SERVICE_START_PENDING ? 0 : SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
        NO_ERROR,
        0,
        checkPoint,
        waitHint,
    };
    SetServiceStatus(g_ServiceStatusHandle, &serviceStatus);
}

Finally, there is a way for a service to shutdown and inform the system that some critical error occured. To do this, report SERVICE_STOPPED and pass error code. The code will be saved along with information about service failture to the system event log.

void ReportErrorStatus(DWORD errorCode)
{
    g_CurrentState = SERVICE_STOPPED;
    SERVICE_STATUS serviceStatus = {
        SERVICE_WIN32_OWN_PROCESS,
        g_CurrentState,
        0,
        ERROR_SERVICE_SPECIFIC_ERROR,
        errorCode,
        0,
        0,
    };
    SetServiceStatus(g_ServiceStatusHandle, &serviceStatus);
}

HandlerEx is a function to handle events sent by the system to control your service - stop it, pause, inform about the system shutdown or simply query for current status. You must always call SetServiceStatus in this function. It can be executed in different thread, so you must synchronize it with the code in ServiceMain. I do this with g_StopEvent - an event that will be set when the service should exit.

// Handler for service control events.
DWORD WINAPI HandlerEx(DWORD control, DWORD eventType, void *eventData, void *context)
{
    switch (control)
    {
    // Entrie system is shutting down.
    case SERVICE_CONTROL_SHUTDOWN:
        g_SystemShutdown = true;
        // continue...
    // Service is being stopped.
    case SERVICE_CONTROL_STOP:
        ReportStatus(SERVICE_STOP_PENDING);
        SetEvent(g_StopEvent);
        break;
    // Ignoring all other events, but we must always report service status.
    default:
        ReportStatus(g_CurrentState);
        break;
    }
    return NO_ERROR;
}

That's all the code I wanted to show. Now, because service cannot be run as normal program, you must learn how to install and uninstall it. Fortunately there is a simple command line program for this distributed with Windows - sc. To install your service, enter following command (exactly like this, with "binPath=" SPACE "PATH"):

sc create SERVICE_NAME binPath= FULL_PATH_TO_EXE_FILE

To uninstall it:

sc delete SERVICE_NAME

To control your service - start it, stop it or query its status - use commands:

sc start SERVICE_NAME
sc stop SERVICE_NAME
sc query SERVICE_NAME

Or simply run Administrative Tools / Services (another way to access it is Start / Run / "services.msc").

Two kinds of command line arguments can be passed to a service. First are argc, argv parameters taken by main function. They come from a command line fixed during installation of the service. Second are argc, argv arguments taken by ServiceMain function. They are different - argv[0] is the service name and the rest are arguments that you passed as additional parameters when calling "sc start" command.

Of course there is more to be told on this subject. Service can depend on some other services, can be automatically started with the system or only on demand, can have priviledges of a selected user or one of standard ones, like "LocalSystem" (biggest priviledges on local system, the default), "LocalService" or "NetworkService". See MSDN Library for details.

Comments | #c++ #windows #winapi Share

# Deeper Look Inside Windows

21:38
Thu
01
Jul 2010

Typically Linux users spend much time dealing with details of their system while Windows users blame all errors on bad Microsoft and Bill Gates, especially nowadays as for more and more people computer usage shrinks only to a web browser. But sometimes it's nice and useful to look into the system, deeper than to the list of files on disk or installed programs in Control Panel / Add or remove programs. Here are some Windows applications that may help with that (use Google to find them by name):

Starting with tools that ship with Windows itself, we have:

More information about the system can be revealed with free programs, like:

Do you know any other tools like these or other types of system information that are worth seeing?

Comments | #windows Share

# SVN in My Windows Made Me Angry

16:41
Thu
11
Feb 2010

Today I had an unpleasant adventure with SVN. Although I'm now going to use Mercurial (with TortoiseHG client) for my home projects, as this whole distributed revision control systems looks quite promising, I wanted to checkout some SVN repository and it turned out to be much bigger problem than I expected.

The obvious solution is to install and use TortoiseSVN - great shell extension for Windows. Unfortunately it doesn't work in my 64-bit Windows 7. Setup succeeds, but then no new items appear in context menus for directories. I tried to install both 64-bit and 32-bit versions, two times, with restarting my computer. Nothing helped. I tried to disable read-only attribute for TortoiseSVN directory, give full permission to this directory for all users, maually run TSVNCache.exe (because it doesn't start automatically) and nothing helped. I also ensured shell extensions are successfully installed by using ShellExView. Google knows this problems, but not the solution.

So then I installed RapidSVN - a normal Windows SVN client. Such application seems even nicer for me than shell extension. But then another obstacle appeared: opening repository in RapidSVN failed with error message: rapidsvn Error: Error while updating filelist (Can't create tunnel: The system cannot find the file specified. ). I though: Fuuuu! After issues with new Windows version here come Linux-like issues with some command-line or config driven, small and independent programs that never smoothly work together. I knew it was probably because the repository I wanted to checkout have an URL starting with svn+ssh:// so the SVN client probably needs to create an SSH tunnel.

After some searching in Google I found a solution. I needed to download PuTTY package and set special environmental variable to point to the plink.exe program that, according to Google, work as SSH tunnel. This variable is named "SVN_SSH" and its value must be like "E:\\PuTTY\\plink.exe" - without quotes, but with these double backslashes! Here I was sure it had to come from the Linux/Unix world, noone other would come up with something like this :P

It seemed to work so I was a step further, but still I couldn't access the SVN repository. This time when checking out, an empty console appeared and freezed so the RapidSVN didn't go any further. I wanted to try some "easy" solution so I installed another windowed client - Qsvn, as well as console SVN client - SilkSVN, but it seemed to recognize and run this SSH tunnel and finally freeze in same situation. So after another Googling I've found this post, opened configuration file "C:\Users\MY_LOGIN\Application Data\Subversion\config" and inserted this line into it:

ssh = E:/PuTTY/plink.exe -l REPOSITORY_LOGIN -pw REPOSITORY_PASSWORD

It finally worked and I could access the repository, but it took me so much time that it made me really angry. I hope I'll live to see the day when there will be no such stupid problems with software. Meanwhile, now you can understand why do I always *very* carefully handle all errors in my code (check returned values, throw exceptions, write logs) - to always know exactly what, when, where and why went wrong, so no annoying things can happen like "context menu items don't show up and I don't know why" or "empty console window opens and freezes".

Comments | #svn #windows #software #tools #version control Share

# Adventures with Windows XP and Windows 7

18:07
Sun
22
Nov 2009

So I'm back after hardware upgrade and system reinstallation. What I want to write about today is my recent adventures with installing Windows. I've decided to install Windows 7 64-bit (as I believe it's already good and very promising platform which will soon become a standard) and Windows XP 32-bit (in case something I need wouldn't work in Win7, like the connection with my Mio palmtop).

I've installed Windows 7 first. While inside the installer, I've created an NTFS partition for that system, called "Win_7". Win7 created one additional 100 MB NTFS partition at the very beginning of my disk, named it "System Reserved" and didn't mount it as any drive letter. Oh well, maybe it's just needed for something...

Then I wanted to install old good Windows XP. Unfortunately WinXP SP2 setup doesn't recognize my SATA disk. I didn't want to switch it from native SATA (AHCI) to IDE emulation mode in BIOS as it degrades performance AFAIK. My motherboard manual and many other sources give a solution as a driver which has to be recorded on a... floppy disk and given to WinXP setup. And I don't even have a floppy disk drive!

Fortunately I've googled another solution. This article shows how to prepare your own "distribution" of Windows XP install CD with selected drivers and updates already integrated inside. All I had to do was to copy original install CD to my hard disk, download and unpack SATA/RAID drivers for my motherboard, install freeware nLite program and use it to burn new CD. It works perfectly! Now I have WinXP install CD which recognizes my SATA disk.

While installing XP, I've created another (third) NTFS partition. I named that partition "Win_XP" and set up WinXP on it. Everything went fine and the only strange thing was different naming of partitions in both systems (you can't change drive letter of the system partition).

But then I was unable to start my Win7 as WinXP installation overwritten MBR with its own, old bootloader without detecting Win7 and adding it to the boot menu. It's interesting that WinXP, although installed on the "Win_XP" partition (E:), placed its Boot.ini file on the "System Reserved" partition.

I tried to modify boot.ini to add Win7 to the menu, but nothing seemed to work. The WinXP boot manager simply isn't able to start Windows 7 and that's exactly what I've found when searching Google. Win7 has its own, new boot menu which has to be used to be able to boot this system.

To restore MBR of Windows 7:

Now, how to add WinXP entry to the Win7 boot menu? The new boot manager of Windows 7 is not such simple text file as boot.ini was, but it's a database stored in this invisible "System Reserved" partition. User can edit the menu using bcdedit command line tool (you must run Command Prompt as Administrator to use it), but there is another solution: a freeware application called EasyBCD. Not only it simplifies this task by providing GUI, but it's also able to switch MBR between XP and Vista/7 version and it also works in Windows XP! It seemed like I was almost there...

But unfortunately the Win7 boot menu sees partitions just like Win7 does, so the first partition - the one where WinXP placed its boot.ini file - was invisible to it. My solution (© Reg ;) was to run WinXP (by switching MBR to XP version), to copy files needed for booting - boot.ini, ntdetect.com, ntldr - from "System Reserved" to "Win_XP" partition and point WinXP entry in the 7 boot menu to the "Win_XP" partition (E:). Finally I could switch back to Win7 MBR with my boot menu working for both systems.

Comments | #windows Share

# Mounting Drives and Directories in Windows

17:27
Sat
10
Oct 2009

You don't have to use only drive letters C:, D:, E: and so on for subsequent disk partitions. Windows gives much freedom in managing drive letters and partitions, if you know how to do that.

First, you can change a drive letter for a hard disk partition or removable disk drive. For example, I like to have my DVD as drive X:. To do that:

Second, you can mount whole partition or drive in an existing, empty directory. To do that:

And finally, you can do the opposite - mount a directory as a separate drive. The way to do it is quite different, as it requires to use a console command:

subst s: d:\Dir\Subdir

To remove such drive, use the following command:

subst s: /D

Comments | #windows Share

# Computer Self-Defense for Beginners

17:22
Sat
04
Jul 2009

Inspired by recent virus-infestation of one of my family member's computer I've decided to write a small guide to computer self-defense for beginners - that is, to write down things that are obvious for every computer scientist, but not for every user. I emphasize I'm not a security specialist so for some of you my thoughts may look lame :)

Historical background: Many years ago people used to copy programs and transfer them between computers using floppy disks. Viruses were infecting EXE files by adding their code to programs and once someone ran such file, the virus spread to other programs in his computer. Viruses were sometimes written for fun. Some of them were harmless, while other did "pranks" such as formatting whole hard drive :) Now we live in the Internet era and programs downloaded from the Web or from CD/DVD disks require installation, so viruses like these are no longer effective.

Today's viruses are no longer infecting particular EXE files. They are rather kind of worms or trojan horses (however you call or classify them) - they just install themselves in Windows and run in the background as separate programs. They are neither destroying whole computer nor totally harmless. Modern malware software is part or organized crime, so it can, for example, steal user's passwords to online bank account, MMORPG game or use his computer to perform DDOS attacks and sending spam.

So how (not) to catch a virus? Viruses are not usually able to infect a computer without user's initiative. It's quite safe to use Windows, be connected to the Internet, browse any websites, read any emails, open any files such as music (like MP3), images (like JPG), archives (like ZIP) or documents (like PDF). The exception is when one of the programs have a bug which can be exploited to execute code embedded into document's data. Such critical security bugs are fixed quickly so the security procedure for them is to update your software regularly - use Windows Update / Microsoft Update and install new versions of programs you use, especially these connecting to the Internet.

The only possibility when a virus can run without user's approval is Autoplay technology for flash drives and CD/DVD disks. Each time you enter such media, Windows looks for autorun.inf file and can automatically run prepared program. As pendrives are very popular nowadays, I consider critical for computer security to turn off the Autoplay functionality. You can do it using free Tweak UI tool, just like that:

Tweak UI Autoplay

It's amazing to me how some people constantly suffer from viruses on their computers while other almost never catch any. Do the second never visit porn sites or use cracks and pirated software? Maybe, but I think it's rather the matter of obeying some simple security rules. Websites, emails or image/music/document files are not able to run arbitrary code on your computer. You must explicitly agree for that. This danger comes in two forms. First one is when a website wants to run/install something on your computer, usually using ActiveX technology. You can see warning about that asking if you really want to allow the website to run such program. Virus installs itself on your computer only if you agree to that.

The second danger is when you just run new EXE file. How to distinguish between safe and dangerous executables? First of all, never run unknown EXE files just for fun. Never trust it's a new brilliant porn screensaver, good and free antivirus software or a document in executable form (like image gallery, video, ebook, archive), even if you have it from your best friend. Pirated software and cracks/keygens from P2P networks also very often contain viruses. On the other hand, you can be almost sure it's safe when you download a well-known application from its author website or a website such as SourceForge.net. If you are not sure about an executable file and you really need to run it, scan it with an antivirus first.

I believe these simple rules are worth much more than not using Windows, Internet Explorer, Outlook Express or cracks/pirated software and using any firewall or resident antivirus protection.

Comments | #windows #software Share

# Windows 7 RC - moja recenzja

20:27
Sat
30
May 2009

Zainstalowałem na swoim laptopie dostępną za darmo, testową wersję Windows 7 RC. Laptop jest raczej złomowy i nie spełnia nawet wymagań (procesor Turion 64, 1.8 GHz, 1 GB RAM, a wersja 64-bitowa wymaga 2 GB RAM). Mimo tego nowy Windows działa całkiem nieźle. Ale po kolei... Poniżej moja mała recenzja Windows 7, z perspektywy stałego użytkownika Windows XP, który nie lubi i nie używa Visty.

Instalacja trwała ok. pół godziny. Pierwsze wrażenie: system jest ładny, podoba mi się jego styl graficzny. Pamięć RAM zajęta po uruchomieniu systemu, bez żadnych uruchomionych programów: 500 MB. To już mi się mniej podoba.

Nowy sposób, w jaki najczęściej używane programy można dodawać do paska zadań i do menu Start, podoba mi się bardzo. Nareszcie można przestawiać przyciski programów na pasku zadań!!! - coś czego od zawsze brakowało w Windowsie i o czym zawsze marzyłem :)

Read full entry > | Comments | #windows Share

# Mój niezbędnik - Najlepsze programy

21:16
Tue
19
May 2009

Zebrałem tu listę programów, których używam i które polecam do poszczególnych zastosowań. Każdy z nas ma swoje ulubione programy, ale to który jest lepszy to zwykle nie jest kwestia gustu, tylko obiektywny fakt. Dlatego aby wiedzieć o dobrych programach, warto się takimi informacjami jak te tutaj wymieniać. W komentarzach piszcie, jakie są wasze ulubione programy.

Założenia wstępne: Używam Windows XP. Staram się używać programów darmowych, a nie piracić (wszędzie, gdzie nie wspominam o kosztach, mowa jest o programie Freeware lub Open Source). Komputera używam do wielu różnych rzeczy, ale przede wszystkim do programowania.

Ogólne

Manager plików: Total Commander. Jest bezdyskusyjnie bezkonkurencyjny. Niestety jest Shareware. Niezarejestrowana wersja w pełni działa, ale legalnie można jej używać tylko przez 30 dni.

Kompresja: 7-Zip. Pakuje formaty 7z, zip, gzip, bzip2, a jeszcze więcej rozpakowuje (w tym rar). Rozpakowywać różne archiwa potrafi też wprawdzie Total Commander, ale 7-Zip ma fajny interfejs (bardzo podobny do WinRAR) i do obliczeń wykorzystuje obydwa rdzenie procesora. Trzeba w tym miejscu dodać, że nie ma darmowych programów zdolnych pakować format rar - to potrafi tylko płatny WinRAR.

Antywirus: Mamy już na szczęście takie czasy, że są darmowe i niezłe programy antywirusowe. Mnie najbardziej podoba się Avira AntiVir. Niezły jest też avast!, ale wymaga darmowej rejestracji e-mailowej raz do roku i mniej mi się podoba jego interfejs. Cały czas zastanawiam się też nad zakupem komercyjnego pakietu bezpieczeństwa (firewall + antywirus i inne) - to wydatek rzędu 150-200 zł. Poza tym w szukaniu szkodników w systemie pomóc może HijackThis (pokazuje podejrzane dodatki zainstalowane w systemie), SpyBot Search & Destroy (skanuje system jak antywirus, ale pod kątem spyware, adware i podejrzanych ciasteczek) oraz ShellExView (listuje i zarządza zainstalowanymi rozszerzeniami powłoki systemowej).

Emulacja napędu CD/DVD z plików z obrazem płyt (np. ISO): Daemon Tools.

Launchy - używam go zamiast Menu Start i Pulpitu. Pisałem o nim tutaj.

Samurize - wykresy pokazujące statystyki działania komputera. Pisałem o nich tutaj.

Nagrywanie płyt: Nero Express dołączany do nagrywarek. Potrafi wszystko co potrzebne.

WinDirStat - bardzo oryginalny program, który analizuje wybrany dysk lub katalog, a potem pokazuje graficznie i w kolorach, które podkatalogi i które typy plików zajmują jak dużo miejsca.

Console2 - zamiennik systemowej konsoli. Pozwala zmieniać czcionkę i ogólnie jest sympatyczny. Obsługuje zakładki. Można do niego podłączać inne "powłoki", np. Windows PowerShell czy Python (command line).

TweakUI - pozwala konfigurować masę ustawień systemowych, np. łatwo wyłączyć wszelkie autostarty z płyt CD i pamięci Flash (co moim zdaniem jest obecnie podstawą bezpieczeństwa komputera, bo wirusy często przenoszą się przez Pendrive).

Platformy: DirectX Redistributable, .NET Framework (pobiera się go przez Windows Update), Java Runtime Environment, Adobe Flash Player.

Read full entry > | Comments | #windows #software Share

Pages: > 1 2 3 4 5 >

STAT NO AD
[Stat] [STAT NO AD] [Download] [Dropbox] [pub] [Mirror]
Copyright © 2004-2017