# [FAQ] 3ds Max — Installed, but the OS Tools menu does not appear

**Applies to:** OS Max tools (Fast Ref, BipedPlus) and Cross DCC tools (SkinLayer Studio).  
This is not a SkinLayer Studio-only issue. It can appear on any OtakuSolutions tool that uses 3ds Max `startup`.

## When this happens

Use this page if **all** of the following match.

- The **OS Tools** menu is missing from the 3ds Max menu bar.
- An OS Max tool or a Cross DCC tool cannot find Max.
- The installer still shows `up to date` / a normal install.
- Restarting Max and the tool does not change it.
- A manual run of the file may still work.

This is not a bad install. You do not need to put the files back in.

---

## If this is not your case

If **OS Tools is visible**, but SkinLayer Studio **[Re]** still fails,  
an earlier `startup` script may have errored. Use this page instead:

https://docs.otakusolutions.com/guide/skin-layer-studio/faq02-max-manual-connect?lang=en

---

## Why this happens

Windows 11 sometimes stamps a **System folder** mark on the user folder (`%LOCALAPPDATA%`).

3ds Max **2021 Update 3 and later** is supposed to run `startup` scripts at launch.  
If the location is marked System or Hidden, Max **skips those files silently**. No error dialog appears.

So the connector and menu files can be in the right place, while Max never auto-runs them.  
Scene files, shortcuts, and your work stay untouched. Only the folder marks are cleared.

| | What it does |
|---|---|
| Windows 11 | May stamp System on the user folder |
| 3ds Max 2021 U3+ | Will not run startup from a System/Hidden location |

---

## Fix — clear the marks only

The script below **does not create or delete files.** It only clears Hidden / System marks.  
The Hidden mark on `%LOCALAPPDATA%` itself is left alone. That can be a Windows default.

### 1. Paste the script

1. In 3ds Max, open **F11** (MAXScript Listener).
2. Click the **lower white pane**.
3. Copy the **entire** script below, paste it, and press **Enter**.
4. Do not drag it into the viewport. Do not copy it into the `startup` folder.

```maxscript
-- ============================================================================
--  STEP 2 - clear Hidden/System, text only.
--
--  Standalone. Paste this file by itself. It does not need the diagnostic
--  window, and the diagnostic window does not call this file.
--
--  Paste into the Listener (F11), Enter, then RESTART Max.
--  Clears attribute bits only. Creates, moves or deletes nothing.
--    1) SYSTEM on %LOCALAPPDATA% - Win11 24H2 stamps it, and Max then skips
--       every user startup script and macro underneath.
--    2) HIDDEN/SYSTEM on the Max user script folders and our files.
--  Hidden on LOCALAPPDATA itself is left alone: it can be a Windows default
--  there, and clearing it would be an unrequested change to the user's PC.
--
--  ASCII only, on purpose - this runs on machines with any locale.
-- ============================================================================

(
    local localApp = ""
    try ( localApp = systemtools.getEnvVariable "LOCALAPPDATA" ) catch ( localApp = "" )
    local scripts  = getDir #userScripts
    local startup  = getDir #userStartupScripts
    local macros   = getDir #userMacros

    local pkgDirs = #("os_skinLayerStudio_connector", "os_fast_ref_package", "os_bipedPlus_package")
    local ourStartupMs = #(
        "os_sls_connector_launcher.ms", "os_sls_00_menu.ms",
        "os_fast_ref_menu.ms", "os_fast_ref_path.ms",
        "os_bipedPlus_menu.ms", "os_bipedPlus_path.ms"
    )
    local ourMacros = #(
        "sls_connector.mcr", "os_tools_about.mcr",
        "os_fast_ref.mcr", "os_bipedPlus.mcr"
    )

    fn q p = "\"" + p + "\""

    fn runAttrib arg = (
        local cmd = "attrib " + arg
        format "  %\n" cmd
        try ( HiddenDOSCommand cmd ) catch (
            try ( DOSCommand cmd ) catch ( format "    (attrib failed)\n" )
        )
    )

    fn show lbl p = (
        local h = true
        local s = true
        try ( h = getFileAttribute p #hidden ) catch ()
        try ( s = getFileAttribute p #system ) catch ()
        format "  hidden=% system=%  %\n" h s lbl
    )

    fn clearOne p = (
        try ( setFileAttribute p #hidden false ) catch ()
        try ( setFileAttribute p #system false ) catch ()
    )

    format "\n========== STEP2 attrib fix ==========\n"

    -- 1) LOCALAPPDATA: System only. /D is required so attrib treats the
    --    argument as the directory itself and not as a file pattern.
    if localApp != "" then (
        format "\n-- 1) LOCALAPPDATA, System only --\n"
        try ( setFileAttribute localApp #system false ) catch ()
        runAttrib ("-s " + (q localApp) + " /D")
    ) else (
        format "\n-- 1) LOCALAPPDATA not readable, skipped --\n"
    )

    format "\n-- 2) Max user folders --\n"
    for d in #(scripts, startup, macros) do runAttrib ("-h -s " + (q d) + " /D")
    runAttrib ("-h -s " + (q (pathConfig.appendPath startup "*")))
    runAttrib ("-h -s " + (q (pathConfig.appendPath macros  "*")))

    format "\n-- 3) product package folders --\n"
    for nm in pkgDirs do (
        local pkg = pathConfig.appendPath scripts nm
        if doesFileExist pkg do (
            runAttrib ("-h -s " + (q pkg) + " /D")
            runAttrib ("-h -s " + (q (pathConfig.appendPath pkg "*")) + " /S /D")
        )
    )

    -- Belt and braces for environments where attrib.exe is blocked.
    for n in ourStartupMs do clearOne (pathConfig.appendPath startup n)
    for n in ourMacros    do clearOne (pathConfig.appendPath macros  n)

    format "\n-- verify (want system=false everywhere) --\n"
    format "   LOCALAPPDATA may keep hidden=true, that is fine.\n"
    if localApp != "" do show "LOCALAPPDATA" localApp
    show "scripts" scripts
    show "startup" startup
    show "usermacros" macros
    for n in ourStartupMs do (
        local p = pathConfig.appendPath startup n
        if doesFileExist p do show n p
    )
    for n in ourMacros do (
        local p = pathConfig.appendPath macros n
        if doesFileExist p do show n p
    )

    format "\nNext: paste step3_connect_and_menu.ms to use the tool right now.\n"
    format "Then CLOSE Max completely and reopen - paste nothing that time.\n"
    format "=====================================\n"
)
```

If the Listener prints a `STEP2 attrib fix` log, the step succeeded.

### 2. Close Max completely, then reopen

Do **not** paste any script on this restart.  
This checks whether Max now reads `startup` by itself.

---

## Check

| Before | After |
|---|---|
| No OS Tools on the menu bar | OS Tools menu is visible |
| The tool cannot see Max | Connects automatically when Max starts |
| Install files were already there | No reinstall needed |

![OS Tools menu after restart](img_02_os_tools_menu.png)

If **OS Tools** is on the menu bar after restart, you are done.  
You do not need to install again or paste another script.

---

## Do not

- Reinstall the same files
- Expect **Run as administrator** on SkinLayer Studio to fix this
- Delete files inside `startup`
- Run a `.bat` or exe that we did not give you

---

## Still failing?

Windows rarely stamps the same mark again.  
If the menu disappears after a later launch, tell us.

- Feedback: https://otakusolutions.com/en/feedback
- Contact: https://otakusolutions.com/en/contact

If OS Tools is visible but the connection still fails, see FAQ.2.

https://docs.otakusolutions.com/guide/skin-layer-studio/faq02-max-manual-connect?lang=en