вопрос по CreateFileMapping

Discussion in 'WASM.WIN32' started by ptr, Jun 2, 2010.

  1. ptr

    ptr New Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2009
    Messages:
    130
    можно ли сделать следующее
    1)в программе создаю проекцию для данных(CreateFileMapping)
    2)выхожу из программы(ExitProcess)
    3)запускаю ехе, открываю проекцию и работаю с ней(OpenFileMapping), созданную в п.1
    нужно чтобы созданный объект-проекция не закрывался после выхода.
    спасибо
     
  2. 7mm

    7mm New Member

    Blog Posts:
    0
    Joined:
    Dec 15, 2009
    Messages:
    442
    Нет, так нельзя.
     
  3. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    если только проецировать файл... и то надо будет флаш делать для сохранения изменений, ну или корректно закрывать отображение...
     
  4. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    ptr,

    Всё, принадлежащее процессу, умирает вместе с ним, не так ли?
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Blog Posts:
    0
    Joined:
    Mar 6, 2008
    Messages:
    623
    ptr
    >можно ли сделать следующее
    На самом деле можно. При создании объекта нужно указать атрибут OBJ_PERMANENT. Но чтобы вызов прошёл успешно, необходимо обладать привилегией SeCreatePermanent – по умолчанию её нет даже у админов.
    (Нет, конечно можно и хендл секции в какой-нибудь другой процесс сдуплировать – но даже при оставленном в стороне обсуждении чистоты этого метода возникает вопрос о гарантии сохранности процесса-носителя).

    Rel
    Флаш для сохранения изменений не нужен.
     
  6. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    Надо попробовать процессы с PID 0 и 4. Возможно, получится.
     
  7. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    если процесс выйдет через ExitProcess без закрытия хендла изменения сохранятся?
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Blog Posts:
    0
    Joined:
    Mar 6, 2008
    Messages:
    623
    Да. Хендлы закроются, отображения размапятся. Изменения сохранятся.

    Вообще говоря, при работе с отображениями нет необходимости хранить хендлы:
    Code (Text):
    1. file = CreateFile();
    2. section = CreateFileMapping(file);
    3. CloseHandle(file);
    4. view = MapViewOfFile(section);
    5. CloseHandle(section);
    6. *PDWORD(view) = 54;
    7. // UnmapViewOfFile(view);   // what
    8. TerminateProcess(self);     // ever
    9.  
    10. // Изменения сохранены.
     
  9. TSS

    TSS New Member

    Blog Posts:
    0
    Joined:
    Apr 13, 2009
    Messages:
    494
    Немного дополню Sol_Ksacap.

    Пользовательские хендлы храняться в таблице хендлов процесса, объекты процесса храняться в АП процесса. При закрытии процесса уничтожается АП, закрываются хендлы. Файлмаппинг же никак на виртуальной памяти не завязан, отсюда и нет необходимости хранить хендлы для него.
     
  10. ptr

    ptr New Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2009
    Messages:
    130
    спасибо за разъяснения.
     
  11. TSS

    TSS New Member

    Blog Posts:
    0
    Joined:
    Apr 13, 2009
    Messages:
    494
    Я наврал немного, CreateFileMapping не выделяет вирт. адреса ни в каком процессе(разве что за исключением выделения места под внутренние нужды, объект секция и тд), а MapViewOfFile выделяет.
     
  12. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    неправдо.

    api: ZwMakeTemporaryObject, ZwMakePermanentObject.
    ну, и как уже сказали, OBJ_PERMANENT флаг в OBJECT_ATTRIBUTES. на всё это нужны права.
     
  13. ptr

    ptr New Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2009
    Messages:
    130
    ок