[windows] jak przekazac handle?

0

Chcialbym stworzyc proces na osobnym (nie interaktywnym) window station z defaultowa nazwa (CreateWindowStation z 1wszym argumentem NULL).

Niestety mam sporo problemow. W prawdzie wszsytko dziala, ale mi sie to nie podoba.

Czy da sie przekazac handle do window station procesowi?
Jak ustawie dziedziczenie to owszem obiekt sie dziedziczy, ale proces zostaje przypisany do defaultowego window stationts (winsta0), chyba ze przekaze moj wlasny w lpDesktop. Niestety, moge przekazac tylko nazwe, a nie handle. Problem jest do obejscia dzieki GetUserObjectInformation() ale to brzydko wyglada. Nie po to tworze window station, by pozniej pobierac jej nazwe zeby ja przekazac procesowi.

Sprawa z desktopem ma sie jeszcze gorzej. Musze wpisac WLASNA nazwa, mam se ja wymyslec/wylosowac? co to ma byc! dlaczego nie moge podac 0 zamiast nazwy, by system zrobil to za mnie, jak jest z window station?

Moze zle podchodze do tematu. Chce napisac program ktory dziala w tle, nie ma zadnych interakcji z uzytkownikiem oprocz jednego okna ktore mu otwieram do kontroli.

chce (w fukncji CreateProcess->startupinfo->lpDesktop) podac handle zamiast nazw, i zrobic jakas defaultowa nazwe desktopu.
da sie to zrobic inaczej czy nie?

0

Da się przekazać wszystko, co można przedstawić w postaci ciągu znaków. Na przykład przez environmnet (1 z 2 sposobów):

SetUserObjectInformation(HWINSTA/HDESK, UOI_FLAGS,...); // inheit
SetEnvironmentVariable("hdesk", strformat("%d", hdesk));
SetEnvironmentVariable("hwstation", strformat("%d", hwstation));
CreateProcess(inheit=true, environment=null);

// process 2
GetEnvironmentVariable("hdesk", buf, cch); sscanf(buf, "%d", &hdesk);
GetEnvironmentVariable("hwstation", buf, cch); sscanf(buf, "%d", &hwstation);
SetProcessWindowStation(hwstation);
SetThreadDesktop(hdesk);
// gdi functions here

Wystarczy że stworzysz nowy desktop, a jego nazwę wstawisz do startupinfo (nowa WindowStation wcale nie jest potrzebna). Wtedy każdy wątek nowego procesu automatycznie zostanie podczepiony pod ten desktop.
Przekazując desktop inaczej, sam musisz zagwarantować że każdy wątek sam się podepnie pod odpowiedni desktop.

Dwa, to po co nowy desktop, skoro program nie otwiera okien? A może otwiera, ale nie chcesz ich widzieć?

0

tego wlasnie chcialbym uniknac, nie lubie uzywac nazw.

Dwa, to po co nowy desktop, skoro program nie otwiera okien? A może otwiera, ale nie chcesz ich widzieć?

chce uzysac pelna izolacje od usera, ten program bedzie uruchamial jeszcze inne, ktore moga miec okna.
poza tym mam zamiar tworzyc okna bo windows posiada kilka rzeczy ktorych bez okien nie da sie zrealizowac. fakt ze beda one niewidoczne, ale zalezy mi na izolacji.

A tworze to na nowym window station bo wg mnie, nie wiem ile w tym prawdy, winsta0 to stacja przeznaczone dla usera, a service-0x..... jest przeznaczona wlasnie dla nie interaktywnych programow. Czy ma to sens? Chyba tylko taki, ze jesli user bedzie przelaczal desktopy to nie zasmiece mu listy swoim, na ktorym nic NIE MA. No i oczywiscie izolacja, jesli proces bedzie dzialal pod innym userem, a stworze okno na pulpicie do ktorego ma dostep inny - bedzie problem. Taka sytuacja moze miec miejsce, jak desktop ktory przekazuje w startupinfo bedzie juz istniel. A jak tworze nowa window station, mam gwarancje ze stworzy sie unikalna dla obecnego procesu, a jesli istniala to tylko i wylacznie mogla byc stworzona przez sesje do ktorej nalezy moj program, tylko grupa administrators moze podac nazwe w CreateWindowStation().

wiec window station gwarantuje mi izolacje, a ze musi ona posiadac desktop - musze go stworzyc. Wolalbym zrobic to anonimowo, bez podawania nazwy, by system mi jakas przydzielil, i o to sie wlasnie pytam - czy da sie tak zrobic? No i nastepnie przekazac handle WS i desktop do procesu przy jego tworzeniu.

Najbardziej zalezy mi na poprawnym przydzielaniu desktopa,

0

@sapero, to ten sam abuser co zwykle, jak znam życie to znowu trojana pisze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1